私のバイナリには次の行が表示されます。
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
取り除いてはいけないのでしょうか?実際、もっと混乱しているのは、もともとこれが存在する理由です。ホスト上でのみ実行されるgccの基本的なコンパイルは少し奇妙だと思います。このバイナリをコピーして貼り付けるコンピュータにある場合とない場合がある任意のlibcに依存するのは危険ではありませんか?私は理解できません。 Windowsでは、コンパイルした正確なランタイムに合わせてバージョン管理されている一種の「ランタイム不足」エラーが発生しているようです。したがって、特定のコンパイラを使用してXPでコンパイルする場合は、ホストにもランタイムがインストールされている必要があります。しかし、Linuxではこれが起こるというニュースを聞いたことがありません。それともどこかに50の異なるlibc.soディレクトリがあり、私のアプリケーションが起動しようとしているときに正しいディレクトリが接続されていますか? Linuxには.dll地獄があると思いますが、そうではありません。
答え1
少なくともGNU Cライブラリの場合、リンクは使用されているすべてのシンボル(関数など)のバージョン情報を渡します。objdump -T
たとえば、次のように表示できます/bin/ls
。
DYNAMIC SYMBOL TABLE:
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.3 __ctype_toupper_loc
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __uflow
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 getenv
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 sigprocmask
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.3.4 __snprintf_chk
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 raise
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 free
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 abort
など。
Cライブラリ開発者は、Cライブラリが以前のバージョンと互換性があるようにするために多くの努力を払っています。上記の出力は、Cライブラリバージョン2.3以降がls
必要であることを意味します。__ctype_toupper_loc
必要なすべてのシンボルを提供するすべてのCライブラリは指定されたバイナリを実行できます。
これを行うもう1つの方法は、Linuxベースのシステム(実際にはELFベースのシステムや他のシステム)のほとんどのライブラリで使用されるsonameです。各ライブラリは、名前だけでなく、主要な変更が導入されるたびに(場合によってはより頻繁に)変更されるバージョン番号も定義します。異なる名前を持つ複数のバージョンのライブラリを並列にインストールできます。
-rw-r--r-- 1 root root 2500416 Dec 16 21:07 libcrypto.so.1.0.2
-rw-r--r-- 1 root root 2711616 Nov 28 23:43 libcrypto.so.1.1
(これは返品依存関係の名前が示すように、Cライブラリで使用されていますが、libc.so.6
最後のGNU Cライブラリsonameの競合は数年前に発生しました。 )
タイトルの問題を解決するために、Cライブラリを静的にリンクすることが可能ですが、これはほとんど必要ないか便利ではありません。 (そしてCライブラリが静的にリンクされていても、Cライブラリの一部が動的にリンクされているので混乱する可能性があります。)他のライブラリを静的にリンクすると便利です。他の言語は異なるアプローチを使用します。たとえば、Go プログラムは静的にリンクされます。