LSB AppChecker:针对未使用的库GCC链接
-
20-08-2019 - |
题
我正在检查的共享对象(的.so)与LSB AppChecker的便携性。结果 之一的它报告的问题是,有一个没有被使用,但对反正连接一个外部库(的libm.so.6)。
我怎么能防止从GCC链接至本不需要的图书馆吗?
修改强>结果 针对我的共享对象中的LDD命令的输出是:
linux-gate.so.1 => (0x009ff000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x003dc000)
libm.so.6 => /lib/libm.so.6 (0x00110000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00137000)
libc.so.6 => /lib/libc.so.6 (0x0021d000)
/lib/ld-linux.so.2 (0x0097f000)
解决方案
传递-Wl,-as-所需参数作为链接器命令行的一部分。这将自动放弃你实际上并没有使用符号的任何直接依赖库。
$ g++ -o test test.cpp -lm; readelf -d test|grep '(NEEDED)'
0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6]
0x0000000000000001 (NEEDED) Shared library: [libm.so.6]
0x0000000000000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
$ g++ -o test test.cpp -lm -Wl,-as-needed; readelf -d test|grep '(NEEDED)'
0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
其他提示
除非你在你自己的链接命令指定-lm,你使用其他库可能是依赖于数学库。通过这样的事实,这个问题被标记C ++来看,你可能得到它与++的libstdc连接的副作用,有没有什么可以做。
% ldd /usr/lib/libstdc++.so.6
linux-gate.so.1 => (0x4001e000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x40127000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x4014d000)
/lib/ld-linux.so.2 (0x40000000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x402b1000)
不隶属于 StackOverflow