はい、初期化時にリンクします。技術的には、動的リンカはそのままで完全に解決されるため、オブジェクトの解決と再配置は必要ありませんが、シンボルを定義し、「解釈」しているバイナリを解決するときにそれらを処理する必要があり、それらのシンボルが更新されます。ロードされたライブラリ内の実装を指すようにします。特に、これは malloc
に影響します — リンカーには、対応するシンボルを備えた最小限のバージョンが組み込まれていますが、ロードされて再配置されると (または挿入されたバージョンがある場合は介在バージョンによってさえも) C ライブラリのバージョンに置き換えられます。リンカーが壊れる可能性がある時点では発生しません。
詳細は rtld.c
にあります 、dl_main
関数。
ただし、ld.so
に注意してください。 外部依存関係はありません。 nm -D
に関連するシンボルを確認できます;未定義のものはありません。
マンページは /lib
直下のエントリのみを参照しています 、つまり /lib/ld.so
(a.out
をサポートする libc 5 動的リンカー ) および /lib*/ld-linux*.so*
(ELF をサポートする libc 6 動的リンカー)。マンページはとても 特定、および ld.so
ld-2.28.so
ではありません .
現在のシステムの大部分に見られる動的リンカーには、a.out
が含まれていません。 サポート。
file
と ldd
静的にリンクされたバイナリを構成するものの定義が異なるため、動的リンカーについて異なることを報告します。 ldd
の場合 、 DT_NEEDED
がない場合、バイナリは静的にリンクされています シンボル、つまり 未定義のシンボルはありません。 file
の場合 PT_DYNAMIC
がない場合、ELF バイナリは静的にリンクされます。 セクション (これは file
のリリースで変更されます) 5.37に従います。 PT_INTERP
の存在を使用するようになりました コード内のコメントと一致する、動的にリンクされたバイナリのインジケーターとしてのセクション)。
GNU C ライブラリの動的リンカーには DT_NEEDED
がありません 記号ですが、PT_DYNAMIC
があります セクション (技術的には共有ライブラリであるため)。その結果、ldd
(動的リンカー) は、静的にリンクされていることを示しますが、file
動的にリンクされていることを示します。 PT_INTERP
がありません セクションなので、file
の次のリリース また、静的にリンクされていることも示します。
$ ldd /lib64/ld-linux-x86-64.so.2
statically linked
$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
(file
の場合) 5.35)
$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
(現在開発中のバージョンの file
を使用) ).