私の共有ライブラリは、すでにlibnew.so
構築されているサードパーティの共有ライブラリの一部のシンボルを使用しますlibold.so
。しかしlibnew.so
、。まだ接続が必要です。libold.so
また。それ以外の場合、リンカーは文句を言うでしょうundefined reference to symbol...
。
このコマンドを使用して実行可能ファイルをビルドしますlibnew.so
。何らかの理由で現在のディレクトリのみが許可され、ファイルを他の場所に置くことはできません。
ところで、未定義のnm libnew.so
シンボルが表示されます。報告しないでください。ビルドに使用しないとサイズは変わりません!libold.so
ldd libnew.so
libold.so
libold.so
libnew.so
libnew.so
libnew.soの場合:
gcc -Wall -fPIC -c libnew.c
gcc -shared -Wl,-soname,libnew.so.1 -o libnew.so.1.0 *.o -L. -lold
ln -sf libnew.so.1.0 libnew.so.1
ln -sf libnew.so.1.0 libnew.so
実行可能ファイルの場合:
#this does not work and needs -lold as well.
gcc -Wall main.c -L. -lnew -o prog
抜けたものはありますか?ありがとうございます!
答え1
欠落しているのはリンカーコマンドです。
gcc -shared -Wl,-soname,libnew.so.1 -o libnew.so.1.0 *.o -L. -lold
確かにコピーで異議を申し立てlibold.so
たが、おすすめこのファイルのシンボルは、動的ローダにそのシンボルをインポートする場所を伝えます。
通常、誰かが特定のライブラリを抑制/非表示にしようとすると、まず共有ライブラリを作成するために使用されたオブジェクトファイルを再組み立てします。あなた可能これは次の方法で行うことができます。部分リンクしかし、解決策は見えません(共有ライブラリと共有オブジェクトは互いに置き換えて使用できないためです)。
追加資料:
- 複数の.so共有ライブラリのマージ(これはうまくいかないと言ってください…)
- GNUリンカの部分リンクとは何ですか?
ld
- GNUリンカー