はい、初期化時にリンクします。技術的には、動的リンカはそのままで完全に解決されるため、オブジェクトの解決と再配置は必要ありませんが、シンボルを定義し、「解釈」しているバイナリを解決するときにそれらを処理する必要があり、それらのシンボルが更新されます。ロードされたライブラリ内の実装を指すようにします。特に、これは 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 を使用) ).