/bin/bash
(動的リンカー/ローダー)を含む/lib64/ld-linux-x86-64.so.2
の共有オブジェクトの依存関係を検討します。
ldd /bin/bash
linux-vdso.so.1 (0x00007fffd0887000)
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f57a04e3000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f57a04de000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f57a031d000)
/lib64/ld-linux-x86-64.so.2 (0x00007f57a0652000)
/lib64/ld-linux-x86-64.so.2
を調べると、/lib/x86_64-linux-gnu/ld-2.28.so
へのシンボリックリンクであることがわかります。
ls -la /lib64/ld-linux-x86-64.so.2
lrwxrwxrwx 1 root root 32 May 1 19:24 /lib64/ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.28.so
さらに、file
は/lib/x86_64-linux-gnu/ld-2.28.so
自体を動的にリンクしていると報告します。
file -L /lib64/ld-linux-x86-64.so.2
/lib64/ld-linux-x86-64.so.2: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
知りたい:
/lib64/ld-linux-x86-64.so.2
)自体を動的にリンクするにはどうすればよいですか?実行時にリンクしますか?/lib/x86_64-linux-gnu/ld-2.28.so
はa.outバイナリ(man ld.so
)を処理するように文書化されていますが、/bin/bash
はELF実行可能ファイルですか?プログラムld.soは、a.outバイナリを処理します。これは、古くから使用されている形式です。 ld-linux.so *(libc5の場合は/lib/ld-linux.so.1、glibc2の場合は/lib/ld-linux.so.2)はELFを扱います。
はい、初期化時にリンクします。技術的には、ダイナミックリンカーはそのままで完全に解決されるため、オブジェクトの解決や再配置は必要ありませんが、シンボルを定義し、バイナリを解決するときにそれらを処理する必要があります。これらのシンボルは更新されます。ロードされたライブラリでの実装をポイントします。特に、これはmalloc
に影響します—リンカーには組み込みの最小限のバージョンがあり、対応するシンボルが付いていますが、ロードされて再配置されると、Cライブラリのバージョンに置き換えられます(または、介在するバージョンがある場合は置き換えられます) 1つは、リンカが壊れる可能性があるポイントでこれが発生しないように注意してください。
詳細はrtld.c
関数の dl_main
にあります。
ただし、ld.so
には外部依存関係がないことに注意してください。 nm -D
に関連する記号を確認できます。未定義のものはありません。
マンページは/lib
、ie/lib/ld.so
(a.out
をサポートするlibc 5ダイナミックリンカー)および/lib*/ld-linux*.so*
(ELFをサポートするlibc 6動的リンカー)。マンページはvery固有であり、ld.so
はld-2.28.so
ではありません。
現在のシステムの大多数にあるダイナミックリンカーには、a.out
サポートが含まれていません。
file
とldd
は、静的にリンクされたバイナリを構成するものの定義が異なるため、動的リンカーに対して異なることを報告します。 ldd
の場合、DT_NEEDED
シンボルがない場合、バイナリは静的にリンクされます、つまり未定義のシンボルがない場合。 file
の場合、PT_DYNAMIC
セクションがない場合、ELFバイナリは静的にリンクされます(これは、5.37以降のfile
のリリースで変更されます。現在は 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
を使用)。
file
プログラムは、動的リンカー/ローダーが動的にリンクされているという点で間違っていると思います。 ldd
プログラムは同意しません。少なくとも私のシステムではありません(Debian Stretch):
ldd /lib/x86_64-linux-gnu/ld-2.24.so
statically linked
man ld.so
も読み取ります:"ld-linux.so * handles ELF"。あなたのシステムでは(そして私もちなみに)どちらも同じバイナリへのシンボリックリンクであり、ELFと(古い)a.out形式の両方を処理できると思います。