libname.a などのスタティック ライブラリにリンクすると、使用される関数のバイナリ コードがアーカイブから取り出され、アプリケーション バイナリに挿入されることを理解しています。したがって、スタティック ライブラリはコンパイル時に存在する必要があります。
ただし、共有ライブラリでは迷子になります。関数定義はコピーされません。では、共有ライブラリをリンカ コマンド ラインで提供する必要があるのはなぜでしょうか。また、共有ライブラリにリンクするさまざまな方法はありますか?それらは何ですか?
共有ライブラリは、特定の関数とこれらの関数が存在するファイルへの参照が実行可能ファイルに格納されるように、リンカーのコマンド ラインに入力する必要があります。実行可能ファイルが実行されると、ダイナミック リンカー (システムによっては 、 など) が最初に読み込まれ、これらの参照がチェックされます/lib/ld-linux.so。/libexec/ld-elf.solib ファイルが見つかると、(mmap()システム コールを使用して) それらをプログラムのアドレス空間にマップします。
これらの参照は、実行することで確認できます
objdump -T a.out
また
nm -D a.out
ELF 実行可能ファイルの場合、この.interpセクションの存在は、プログラムが動的リンクを使用していることを意味します。
明示的な動的リンク ローダーの管理については、 dlopenおよびdlsymのマニュアル ページを参照してください。