web-dev-qa-db-ja.com

gcc-未定義のシンボルを持つ静的ライブラリ?

静的ライブラリを使用してプロジェクトをビルドしようとしています。これにより、ライブラリがインストールされていなくてもバイナリを使用できます。ただし、そうしようとすると、未定義のシンボルについて多くのエラーが発生します。

ライブラリを見ると、.a static lib:であるにもかかわらず、未定義のシンボルがたくさんあることがわかります。

nm - u /usr/local/lib/libthis.a
....
U EVP_DigestFinal_ex
U EVP_DigestInit_ex
U EVP_DigestUpdate
U EVP_MD_CTX_cleanup
U EVP_MD_CTX_init

それらはopensslからのもののようです。その他はlibbzip2からのもののようです。等.

質問:1。静的(.a)libが、静的にコンパイルされていない共有オブジェクト(libopensslなど)に依存しているのはなぜですか? 2.どうすればこれを解決できますか? -lsslを手動で追加しようとしても機能しないようです。バイナリをコンパイルして外部依存関係を持たないようにするにはどうすればよいですか?

11
SRobertJames

静的(.a)libが、静的にコンパイルされていない共有オブジェクト(libopensslなど)に依存しているのはなぜですか?

構築できるほぼすべての静的ライブラリには、未解決のシンボルが含まれます。

int my_open_for_read(const char *filename)
{
  return open(filename, O_RDONLY);  // unresolved reference to open
}

Marc Glisseが指摘したように、これは単純な未解決のシンボルであり、notlibc.soへの依存関係ではありません。

  1. どうすればこれを解決できますか?

ここで解決する問題はありません。バイナリをリンクすると、静的にリンクするライブラリと動的にリンクするライブラリを決定できます。

-lsslを手動で追加しようとしても機能しないようです。

これは機能するはずです:

gcc main.o -lthis -lssl

おそらくあなたは次のようなことをしました

gcc main.o -lssl -lthis

これは間違っています:リンクライン上のライブラリの順序 matters

バイナリをコンパイルして外部依存関係を持たないようにするにはどうすればよいですか?

ほとんどのOSは、完全に静的なバイナリの使用をサポートしています。一般的に、これはnotを目標にする必要があります:lessポータブルバイナリになります、およびそれらの使用は強くお勧めしません。

完全に静的なバイナリを本当に作成したい場合は、-staticフラグでリンクしてください。

なぜ完全な静的は移植性が低いと言うのですか?

彼らは だからです。

ユーザーがライブラリのまったく同じビルドを持っていない場合、バイナリは共有ライブラリと移植できませんが、静的と移植できます。

これは正しくありません。ほとんどの共有ライブラリは下位互換性をサポートしています。 libc.so.6バージョン2.22は、10年前のバージョン2.3.6に対してリンクされた実行可能ファイルを問題なく実行します。

あなたがlddfirefoxをするなら

あなたはあなたがしていることに注意を払う必要があります:

file -L `which /usr/bin/firefox`
/usr/bin/firefox: POSIX Shell script, ASCII text executable

シェルスクリプトの内部を見ると、それが/usr/lib/firefox/firefoxを呼び出し、そのバイナリが動的にリンクされていることがわかります。

ldd /usr/lib/firefox/firefox
    linux-vdso.so.1 =>  (0x00007ffca278d000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f511731b000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5117117000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f5116e13000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f5116b0d000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f51168f7000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5116532000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f5117757000)
18