首页 > 解决方案 > 与静态 libstd 链接时的唯一全局符号

问题描述

我正在为另一个系统构建一个共享库。我想让它作为静态链接,包括所有的 libstdc 和 libstdc++,所以我可以在另一个较旧的 linux 上按原样使用它。但是,当我将它与以下选项链接时:

/app/localstorage/dev/gcc/4.8.5/bin/g++ -fPIC -static-libgcc -static-libstdc++ -fno-gnu-unique -shared -Wl,-soname,libsgxstconnector.so -o libsgxstconnector.so one.o two.o -ldl -lrt

在较旧的 linux 上,我无法加载库。错误消息指出

libsgxstconnector.so: undefined symbol: _ZNSt8messagesIcE2idE

旧服务器上的 nm -a 显示:

0000000000411c20 ? _ZNSt8messagesIcE2idE

这个 ?flag 表示 ld 不知道它,这可能是它无法加载的原因。在我的构建 linux 上,它显示它是一个唯一的全局符号(标志 u)

0000000000411c20 u _ZNSt8messagesIcE2idE

因此问题是:是否有可能从我的链接库中消除此功能?是否有任何好的做法来构建与 linux 无关的二进制文件?也许 -fno-gnu-unique 应该在不同的地方?

ldd 输出在所有系统上都是相同的:

linux-vdso.so.1 =>  (0x00007ffd23dac000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fed7ce12000)
librt.so.1 => /lib64/librt.so.1 (0x00007fed7cc09000)
libm.so.6 => /lib64/libm.so.6 (0x00007fed7c985000)
libc.so.6 => /lib64/libc.so.6 (0x00007fed7c5f1000)
/lib64/ld-linux-x86-64.so.2 (0x00000030c4800000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fed7c3d3000)

标签: c++gcclddnm

解决方案


推荐阅读