2009-05-09 9 views
3

LSB AppCheckerで共有オブジェクト(.so)の移植性をチェックしています。
報告されている問題の1つは、使用されていないが、とにかくリンクされている1つの外部ライブラリ(libm.so.6)があることです。LSB AppChecker:未使用ライブラリとのGCCリンク

GCCがこの不要なライブラリにリンクしないようにするにはどうすればよいですか?

EDIT:
私の共有オブジェクトに対してlddコマンドの出力は次のとおりです。あなたがあなた自身のリンクコマンドで-lmを指定している場合を除き

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) 

答えて

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] 
+0

少なくともLinuxではg ++は常にリンク行に '-lm'を追加します。問題を示すために明示的な '-lm'は必要ありません。 –

+0

ありがとうございます。今度はAppCheckerはlibm.so.6については不平を言っておらず、readelfでもそれは表示されません。不思議なことは、lddは依然として外部依存としてlibm.so.6を示しているということです。なぜ誰も知っていますか? – GetFree

+1

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が表示されます。 –

-1

、あなたが使用している他のライブラリがおそらくあります数学ライブラリに依存します。この質問が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) 
+0

しかし、AppCheckerは、依存関係の1つのレベルを2つではなく(つまり、依存関係の依存関係ではない)チェックすることになっています。どちらの方法でも、私の共有オブジェクトはlibm.so.6とリンクされており、AppCheckerはそれが必要ないと言います。 質問をlddの出力で更新しました。 – GetFree

+0

'libstdC++'が実行可能に静的にコンパイルされていて、*と*が算術インターフェースを使用していなかったのは事実です。これらのどれも真実ではありません。 –

関連する問題