DSO的动态符号表有64个以下的条目
我正在构建一个32位GCC 4.2.5和64位GCC下的DSO。 64位DSO在动态符号表(nm -D libname.so)中有额外的条目,它们不出现在32位DSO中。
我几乎肯定这是因为32位DSO使用libstdc ++的静态版本:表中的所有额外条目都与std :: vector相关。 一些例子:
W _ZNSt6vectorIPN3BVT17FileSonarListenerESaIS2_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS2_S4_EERKS2_
W _ZNSt6vectorIPN3BVT3Net16UDPMessageSocketESaIS3_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS3_S5_EERKS3_
W _ZNSt6vectorIPN3BVT3Net21MessageSocketListenerESaIS3_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS3_S5_EERKS3_
W _ZNSt6vectorIPN3BVT4HeadESaIS2_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS2_S4_EERKS2_
W _ZSt6__findIN9__gnu_cxx17__normal_iteratorIPN3BVT15ServerDiscovery5EntryESt6vectorIS4_SaIS4_EEEES4_ET_SA_SA_RKT0_St26random_access_iterator_tag
表中的其他符号在源代码中用传统的DLL_EXPORT宏显式标记为默认可见性,并使用-fvisibility = hidden标志进行编译。
是否有任何方法可以在不影响DSO客户端的情况下移除这些意外符号? DSO定义了一个纯粹的C接口,所以没有传递任何STL类型。
这是两个编译器的gcc -v输出:
配置为:../src/configure -v --enable-languages = c,c ++,fortran,objc,obj-c ++,treelang --prefix = / usr --enable-shared --with-system-zlib - libexecdir = / usr / lib --without-included-gettext --enable-threads = posix --enable-nls --with-gxx-include-dir = / usr / include / c ++ / 4.2 --program-suffix = - 4.2 --enable-clocale = gnu --enable-libstdcxx-debug --enable-objc -gc --enable -mpfr --enable-targets = all --enable-checking = release --build = i486-linux-gnu --host = i486-linux-gnu --target = i486-linux-gnu线程模型:posix gcc版本4.2.4(Ubuntu 4.2.4-1ubuntu4)
目标:x86_64-linux-gnu配置:../src/configure -v --with-pkgversion ='Ubuntu / Linaro 4.5.2-8ubuntu4'--with-bugurl = file:/// usr / share / doc /gcc-4.5/README.Bugs --enable-languages = c,c ++,fortran,objc,obj-c ++ --prefix = / usr --program-suffix = -4.5 --enable-shared --enable-multiarch - -with-multiarch-defaults = x86_64-linux-gnu -enable-linker-build-id --with-system-zlib --libexecdir = / usr / lib / x86_64-linux-gnu --without-included-gettext - -enable-threads = posix --with-gxx-include-dir = / usr / include / c ++ / 4.5 --libdir = / usr / lib / x86_64-linux-gnu --enable -nls --with-sysroot = / --enable-clocale = gnu --enable-libstdcxx-debug --enable-libstdcxx -time = yes --enable-plugin --enable-gold --enable-ld = default --with-plugin-ld = ld。 gold --enable-objc-gc --disable-werror --with-arch-32 = i686 --with-tune = generic --enable-checking = release --build = x86_64-linux-gnu --host = x86_64 -linux-gnu --target = x86_64-linux-gnu线程模型:posix gcc版本4.5.2(Ubuntu / Linaro 4.5.2-8ubuntu4)
也许你可以链接-lstdc ++时建立你的.so文件? 像g++ -shared -o yourlib.so yourobjects*.pic.o -lstdc++
也许使用更新的GCC(例如4.6)可能会有所帮助。
链接地址: http://www.djcxy.com/p/49181.html