簡體   English   中英

LSB AppChecker:GCC鏈接未使用的庫

[英]LSB AppChecker: GCC links against unused libraries

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

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

除非您在自己的鏈接命令中指定-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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM