LSB AppChecker:GCC链接未使用的库

时间:2009-05-09 02:52:58

标签: c++ linux gcc shared-libraries portability

我正在使用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)

2 个答案:

答案 0 :(得分:4)

将-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]

答案 1 :(得分:-1)

除非您在自己的链接命令中指定-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)