web-dev-qa-db-ja.com

複数の.so共有ライブラリをマージする

A.soとb.soがあるとします。もちろん、aとbによってエクスポートされたすべての関数を含む単一の共有ライブラリとしてc.soを作成できます。もちろん、すべての内部依存関係(つまり、a.soによって呼び出されたb.soのすべての関数とその逆)を解決しますか?

私は試した

gcc -shared -Wl、soname、c.so -o c.so a.so b.so

しかし、それは機能しません。

A.oとb.oをa.aとb.aにアーカイブし(これはa.oとb.oを変更しないでください)、

gcc -shared -Wl、soname、c.so -o c.so a.a b.a

ありがとう

40
Metiu

複数の共有ライブラリを1つにマージすることは、AIXを除くすべてのUNIXで実際には不可能です。リンカーは.soを「最終」製品と見なします。

ただし、アーカイブを.soにマージしても問題はありません。

gcc -shared -o c.so -Wl,--whole-archive a.a b.a -Wl,--no-whole-archive
44

実際には不可能です。

リンカーの観点から見ると、SOライブラリは、リンクに必要な再配置情報を含まない最終製品です。

両方のライブラリのソースファイルまたはオブジェクトファイルにアクセスできる場合は、それらから結合されたSOをコンパイル/リンクすることは簡単です。

7
laalto