我正在检查的共享对象(的.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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top