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 链接的主要内容,如果未能解决你的问题,请参考以下文章

Python-LSB隐写算法

指针是指向 LSB 还是 MSB?

如何从 nib 中修复此“在托管对象上调用选择器 ... 已被 GC'ed”,其中包含未使用的自定义 UITableViewCell?

Boehm GC 附带的“cord”库导致未定义的引用错误

GC垃圾回收

去GC似乎没有收集我的未引用的图像加载指针? [关闭]