LSB AppChecker:针对未使用库的 GCC 链接
Posted
技术标签:
【中文标题】LSB AppChecker:针对未使用库的 GCC 链接【英文标题】:LSB AppChecker: GCC links against unused libraries 【发布时间】:2009-05-09 02:52:58 【问题描述】:我正在使用 LSB AppChecker 检查共享对象 (.so) 的可移植性。 它报告的问题之一是有一个外部库 (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)
【问题讨论】:
【参考方案1】:将 -Wl,-as-needed 参数作为链接器命令行的一部分传递。这将自动删除您实际上没有使用符号的任何直接库依赖项。
$ 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]
【讨论】:
至少在 Linux g++ 上总是将 '-lm' 添加到链接行;您不需要显式的“-lm”来显示问题。 谢谢。现在 AppChecker 不会抱怨 libm.so.6,readelf 也不会显示它。奇怪的是 ldd 仍然将 libm.so.6 显示为外部依赖项。有谁知道为什么? ldd 显示 libm.so.6 依赖关系,因为 libstdc++.so.6 依赖于 libm.so.6,而 ldd 显示直接和间接依赖关系。要验证,请运行“ldd /usr/lib/libstdc++.so.6”或“readelf -d /usr/lib/libstdc++.so.6”——您会在列表中看到 libm。【参考方案2】:除非您在自己的链接命令中指定 -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)
【讨论】:
但是 AppChecker 应该检查一级依赖而不是二级(即不是依赖的依赖)。无论哪种方式,我的共享对象也与 libm.so.6 链接,并且 AppChecker 说它不需要。我用 ldd 的输出更新了我的问题。 如果libstdc++
被静态编译到可执行文件中并且不使用数学接口,那将是真的。这些都不是真的。以上是关于LSB AppChecker:针对未使用库的 GCC 链接的主要内容,如果未能解决你的问题,请参考以下文章
如何从 nib 中修复此“在托管对象上调用选择器 ... 已被 GC'ed”,其中包含未使用的自定义 UITableViewCell?