動的リンカー/ローダー自体は、「ファイル」レポートに従ってどのように動的にリンクされますか?

動的リンカー/ローダー自体は、「ファイル」レポートに従ってどのように動的にリンクされますか?

/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

私は知りたいです:

  1. 動的リンカー/ローダー()自体はどのように/lib64/ld-linux-x86-64.so.2動的にリンクされますか?ランタイムに独自にリンクされていますか?
  2. /lib/x86_64-linux-gnu/ld-2.28.soa.out バイナリ( man ld.so) を処理するものとして文書化されていますが、/bin/bashELFは実行ファイルですか?

ld.soプログラムは、以前に使用されたフォーマットであるa.outバイナリを処理します(libc5の場合は/lib/ld-linux.so.1、glibc2 ld-linux.soの場合は/lib/)。 2)ELFを処理し、誰もが長年使用してきました。

ベストアンサー1

  1. はい、初期化時にそれ自体が接続されます。技術的には、動的リンカー自体はオブジェクトの検証と再配置を必要としません。なぜなら、オブジェクトをそのまま完全に解決するからです。ただし、シンボルを定義して「解釈」するバイナリを解析するときは、これらのシンボルを処理する必要があり、これらのシンボルはオブジェクトを指すように更新されます。ロードされたライブラリに実装します。特にこれは影響を与えますmalloc。リンカーにはそのシンボルを含む最小バージョンが組み込まれていますが、一度ロードして再配置すると、Cライブラリのバージョン(または挿入されたバージョンでも)に置き換えられるので注意が必要です。リンカーが破損する可能性がある場合は、これが発生しないようにしてください。

    血まみれの詳細は次のとおりです。rtld.cdl_main、関数から。

    ld.soただし、外部依存関係がないことに注意してください。関連する記号を見ることができますnm -D。そのうち未定義のシンボルはありません。

  2. に直接あるマンページへの参照のみ/libつまり /lib/ld.so(libc 5ダイナミックリンカー、サポートa.out)および/lib*/ld-linux*.so*(libc 6ダイナミックリンカー、ELFサポート)。マンページは非常に具体的にはそうではld.soありませんld-2.28.so

    現在、ほとんどのシステムの動的リンカーにはサポートa.outは含まれていません。

fileldd動的リンカーは、静的にリンクされたバイナリを構成する要素の定義が異なるため、動的リンカーについて異なる内容を報告します。のldd場合、バイナリにDT_NEEDEDシンボルがない場合は静的にリンクされます。つまり未定義のシンボルはありません。の場合、fileELFバイナリにPT_DYNAMICセクションがないと静的にリンクされます(これは次の5.37リリースで変更されますfilePT_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

( file5.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)。

おすすめ記事