2012-01-11 7 views
2

私はシンプルなテストバイナリにリンクしようとしている共有ライブラリ(libhoard.so)を持っています。しかし、共有ライブラリでコンパイルしたマシンによっては、テストバイナリには表示されません。マシンにどのような違いがあるのか​​よくわからないし、なぜ私はその質問をしているのか分からない。 「壊れた」マシン上のテストバイナリに共有ライブラリが表示されない理由をトラブルシューティングするために私ができることが不思議ですか?共有ライブラリが不思議にアプリケーションにリンクしない


私は(libhoard.soが同じディレクトリにある)の両方のバイナリをコンパイルするには、次のコマンドを使用:

$ g++ -L. -lhoard hoard_test.o 

壊れたマシン:

$ ldd a.out 
    linux-gate.so.1 => (0x00858000) 
    libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0x004dc000) 
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00aaf000) 
    libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x00675000) 
    /lib/ld-linux.so.2 (0x00d18000) 
    libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0x0040d000) 

作業機:

$ ldd a.out 
    linux-gate.so.1 => (0x00110000) 
    libhoard.so (0x00111000) <----------------- THERE IT IS! 
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x03ba8000) 
    libm.so.6 => /lib/libm.so.6 (0x007a9000) 
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00bf7000) 
    libc.so.6 => /lib/libc.so.6 (0x0063e000) 
    libdl.so.2 => /lib/libdl.so.2 (0x007d4000) 
    libpthread.so.0 => /lib/libpthread.so.0 (0x007db000) 
    /lib/ld-linux.so.2 (0x0061e000) 
ここ

は、いくつかのランダムなバージョン情報です:

壊れたマシン:

$ uname -srv 
Linux 2.6.38-11-generiC#50-Ubuntu SMP Mon Sep 12 21:18:14 UTC 2011 
$ g++ --version 
g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1 

作業機:

$ uname -srv 
Linux 2.6.25.3-18.fc9.i686 #1 SMP Tue May 13 05:38:53 EDT 2008 
$ g++ --version 
g++ (GCC) 4.3.0 20080428 (Red Hat 4.3.0-8) 
+0

作業マシンが64ビット版でインストールされていますが、壊れた版は32ビット版でインストールされていますか? –

+0

両方とも32ビットです( 'uname -m'の出力はi686です) – sholsapp

+0

テストと生産に関連する#defがありますか?リンカーは使用されていないライブラリへのリンクを含んでいません。 –

答えて

7

TL; DRのバージョン:リンクコマンドに-Wl,--no-as-neededを追加します。

一連の実験とOPとの会話の後、私は何が起こっているのか把握しました。

最新バージョンのUbuntuでは、ldはデフォルトで--as-neededを使用しています。明示的に要求されていないライブラリへの参照を削除することです。

Hoardの動作方法は、LD_PRELOADライブラリです。つまり、libhoard.soの関数を直接使用する必要はありません。もちろん、にリンクできます。libhoardに直接リンクしたい場合は... --as-neededを使用するのはもちろんです。

これを発見した後、解決策は簡単です。リンクコマンドのgcc-Wl,--no-as-neededを追加するだけです。

+1

すごい!ありがとうございました! =) – sholsapp

関連する問題