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


12

(ダイナミックリンカー/ローダー)/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/bashが、ELFは実行可能ですか?

プログラムld.soは、かなり前に使用された形式であるa.outバイナリを処理します。ld-linux.so *(libc5の場合は/lib/ld-linux.so.1、glibc2の場合は/lib/ld-linux.so.2)ELFを処理しました。これは誰もが長年使用してきました。


カーネルは、そのような微妙な分類上の微妙さを気にしません(そして、あなたもそうすべきではありません;-))。カーネルは必要ELFsの違いになりインタプリタとそうでないものを。そして、知る限りでは、それ自体が必要なインタープリターを使用することはできません。
mosvy

@StephenKitt鉱山はありません(/lib/x86_64-linux-gnu/ld-2.28.so、debian 10 buster)
モスビー

@mosvyええ、申し訳ありませんが、file静的バイナリの定義方法に関する誤ったコメントと、ld-2.28.so...の現実との間で混乱してしまいました...差別化要因はPT_DYNAMICです。
スティーブンキット

回答:


17
  1. はい、初期化時に自分自身をリンクします。技術的には、動的リンカはそのままで完全に解決されるため、オブジェクト自体の解決と再配置を必要としませんが、シンボルを定義し、バイナリを解決するときにそれらを「解釈」し、それらのシンボルを更新する必要がありますロードされたライブラリでの実装を指すようにします。特に、これは影響しますmalloc-リンカには対応するシンボルを含む最小バージョンが組み込まれていますが、Cライブラリのバージョンがロードおよび再配置されると(または存在する場合は介在バージョンによっても)、いくらか注意して置き換えられますこれがリンカーを壊す可能性のあるポイントで起こらないようにするために取られました。

    機能の詳細はrtld.cにありdl_mainます。

    ただし、ld.so外部依存関係はありません。に関連するシンボルを見ることができますnm -D。それらのいずれも未定義ではありません。

  2. マンページは、の直下のエントリ/libつまり /lib/ld.so(をサポートするlibc 5動的リンカーa.out)および/lib*/ld-linux*.so*(ELFをサポートするlibc 6動的リンカー)のみを参照します。マンページは非常に具体的であり、そうでld.soはありませんld-2.28.so

    現在のシステムの大部分で見られる動的リンカーには、a.outサポートが含まれていません。

fileまたldd、静的にリンクされたバイナリを構成するものの定義が異なるため、動的リンカについて異なることを報告します。の場合ldd、バイナリがない場合DT_NEEDEDつまり未定義のシンボルがない場合、バイナリは静的にリンクされます。の場合file、ELFバイナリはPT_DYNAMICセクションがない場合は静的にリンクされます(これは、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

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)。


動的リンクのコンテキストで「解釈」という言葉が使用されるのはなぜですか?その言葉は通常、プログラミング言語の文脈で使用されます。
z正

「GNU Cライブラリの動的リンカー」とはどういう意味ですか?/lib*/ld-linux*.so*、または3番目の動的リンカーを参照していますか?
z正

ldd静的にリンクされた動的リンカーのレポートはどこで確認できますか?共有オブジェクトの依存関係のリストが空だから?
Shuzheng

動的にリンクされたプログラムは、実行する前に何らかの作業を行う必要があります。その作業は動的リンカーによって行われます。動的リンカーは、最終的にはインタープリターと同様の役割を果たします。再配置テーブルなどを解釈して、コンピューターが実行できるものを生成します。
スティーブンキット

「GNU Cライブラリダイナミックリンカ」と言うとき、GNU Cライブラリに含まれる実装を指し/lib*/ld-linux*.so*ます。通常は、として出荷されます。Linuxには他の実装も利用できるため、動的リンカーの起源を指定しました。
スティーブンキット

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

    ldd /lib/x86_64-linux-gnu/ld-2.24.so
        statically linked
    
  2. man ld.soまた、「ld-linux.so *はELFを処理します」と読みます。お使いのシステム(そして私の方法でも)は両方とも同じバイナリへのシンボリックリンクであり、ELFと(旧式の)a.out形式の両方を処理できると推測します。


受け入れられた回答にどのような情報を追加しますか?
奇跡173

2
@ miracle173この回答は受け入れられた回答よりも古い;-)。
スティーブンキット

あなたが正しいです。私はこれを逃しました。質問と受け入れられた答えは非常に古く、この答えは最後の数時間で投稿されたと思いました。誰かが投稿を変更するまで、私は下票を取り消すことができません。
奇跡173
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.