web-dev-qa-db-ja.com

`file`によって報告されるように、動的リンカー/ローダー自体を動的にリンクするにはどうすればよいですか?

/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.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を扱います。

12
Shuzheng
  1. はい、初期化時にリンクします。技術的には、ダイナミックリンカーはそのままで完全に解決されるため、オブジェクトの解決や再配置は必要ありませんが、シンボルを定義し、バイナリを解決するときにそれらを処理する必要があります。これらのシンボルは更新されます。ロードされたライブラリでの実装をポイントします。特に、これはmallocに影響します—リンカーには組み込みの最小限のバージョンがあり、対応するシンボルが付いていますが、ロードされて再配置されると、Cライブラリのバージョンに置き換えられます(または、介在するバージョンがある場合は置き換えられます) 1つは、リンカが壊れる可能性があるポイントでこれが発生しないように注意してください。

    詳細はrtld.c関数の dl_main にあります。

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

  2. マンページは/libie/lib/ld.soa.outをサポートするlibc 5ダイナミックリンカー)および/lib*/ld-linux*.so*(ELFをサポートするlibc 6動的リンカー)。マンページはvery固有であり、ld.sold-2.28.soではありません。

    現在のシステムの大多数にあるダイナミックリンカーには、a.outサポートが含まれていません。

filelddは、静的にリンクされたバイナリを構成するものの定義が異なるため、動的リンカーに対して異なることを報告します。 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を使用)。

17
Stephen Kitt
  1. fileプログラムは、動的リンカー/ローダーが動的にリンクされているという点で間違っていると思います。 lddプログラムは同意しません。少なくとも私のシステムではありません(Debian Stretch):

    ldd /lib/x86_64-linux-gnu/ld-2.24.so
        statically linked
    
  2. man ld.soも読み取ります:"ld-linux.so * handles ELF"。あなたのシステムでは(そして私もちなみに)どちらも同じバイナリへのシンボリックリンクであり、ELFと(古い)a.out形式の両方を処理できると思います。

0
Hkoof