Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> UNIX /LINUXプラットフォームの実行可能ファイル形式の分析

UNIX /LINUXプラットフォームの実行可能ファイル形式の分析

  
 

この記事では、UNIX /LINUXプラットフォーム用の3つの主な実行可能ファイル形式について説明します。a.out(アセンブラーおよびリンク・エディターの出力アセンブラーおよびリンク・エディターの出力)、COFF(共通オブジェクト・ファイル形式) 、ELF(実行形式とリンク形式の実行形式とリンク形式)。 1つ目は実行可能ファイル形式の概要で、ELFファイルのロードプロセスを説明することによって、実行可能ファイルの内容とロード実行操作の関係を説明します。 3つのファイルフォーマットはこのように議論されました、そして、ELFファイルの動的接続メカニズムは議論されました、そして、さまざまなファイルフォーマットの長所と短所の評価は散在しました。最後に、3つの実行可能ファイル形式の簡単な要約と、ファイル形式の評価に関する著者からのいくつかの考えがあります。

参考文献17)ライティングスキルは、この保護を破る実際的な例です。

2:カーネルは、PT_INTERPとマークされたELFファイルのセグメントに対応する動的コネクタ名を分析し、動的コネクタをロードします。最近のLINUXシステム用の動的リンカは通常/lib/ld-linux.so.2です。詳細は後述します。

3:カーネルは新しいプロセスのスタックにタグと値のペアをいくつか設定して、動的リンカの適切な操作を示します。

4:カーネルは制御を動的コネクタに渡します。

5:ダイナミックコネクタは、プログラムの外部ファイル(共有ライブラリ)への依存関係をチェックし、必要に応じてそれらをロードします。

6:動的リンカはプログラムの外部参照を再配置しますが、素人の言葉で言えば、それは参照する外部変数/関数のアドレスをプログラムに伝えます。動的リンクはまた、「実際」が参照記号を必要とする場合にのみ移動するレイジーポジショニング機能を有し、これはプログラムの効率を大幅に改善する。

7:動的リンカは、ELFファイルで.initとしてマークされているセクションのコードを実行して、プログラムの実行を初期化します。初期のシステムでは、初期化コードは_init(void)関数に対応していました(関数名は強制的に固定されています)。現代のシステムでは、対応する形式はvoid__attribute((constructor))ですinit_function(void){……}
<関数名は任意です。

8:動的リンカはプログラムに制御を渡し、ELFファイルヘッダーに定義されているプログラムエントリポイントから実行します。 a.out形式およびELF形式では、プログラムのエントリポイントの値は明示的に存在し、COFF形式では仕様によって暗黙的に定義されています。

上記の説明からわかるように、ファイルをロードするための最も重要なことは、プログラムセグメントとデータセグメントをメモリにロードすること、外部定義シンボルの再配置を実行することです。再配置はプログラムリンクの重要な概念です。実行可能プログラムは、通常、main()を含むメインプログラムファイル、複数のオブジェクトファイル、および複数の共有ライブラリ(Shared Libraries)で構成されています。 Cプログラムは、共有ライブラリによって定義された変数または関数を参照することがあります、言い換えれば、これらの変数/関数は実行時に知られていなければなりません。住所静的接続では、プログラムが使用する必要があるすべての外部定義は完全に実行可能プログラムに含まれていますが、動的接続では実行可能ファイルに外部定義に関する参照情報しか設定されていません。 。ライブラリ内の変数や関数に変更があった場合はリンカを再コンパイルする必要があります;複数のプログラムが同じ変数/関数を参照している場合は、変数/関数はファイル/メモリに複数回出現します。ハードディスク/メモリスペースを無駄にします。 2つの接続方法によって生成された実行可能ファイルのサイズを比較すると、明らかな違いがあることがわかります。




トップに戻る


参考文献16と参考文献15ソースコードの深化a.outフォーマットの理解参考文献12は、「最新の」Red Hat Linuxでa.outフォーマットファイルを実行する方法を議論している。




トップに戻る


参考資料18、一部のUNIXシステムにもCOFFがあります。動的接続をサポートするXCOFF(拡張共通オブジェクトファイル形式)形式など、形式が拡張されました。参考文献5を参照してください。

ファイルのヘッダーはオプションですCOFFファイルフォーマットの仕様では、オプションのヘッダーの長さを0にできるように指定していますが、オプションのヘッダーはLINUXシステムに存在しなければなりません。以下は、LINUXのオプションヘッダのデータ構造です。typedef struct {char magic [2]; /*マジックナンバー* /char vstamp [2]; /*バージョン番号* /char tsize [4]; /*テキストセグメントの長さ* /char dsize [4]; /*初期化データセグメント長* /char bsize [4]; /*未初期化データセグメント長* /char entry [4]; /*プログラムエントリポイント* /char text_start [4]; /*テキストセグメントベースアドレス* /char data_start [4]; /*データセグメントベースアドレス* /} COFF_AOUTHDR;

フィールドマジックが0413の場合、COFFファイルは実行可能で、オプションのヘッダーが表示されます。標準のCOFFファイルは、通常は.textセクションから始まるプログラムエントリポイントの値を明示的には定義していませんが、この設計は良くありません。

COFF形式にはa.out形式よりも1つ多いセグメントテーブルがあることを説明する前に、1つのセクションヘッダーエントリにセクションデータの詳細を記述します。したがって、COFF形式にはより多くのセクションを含めることができます。実際には、特定のセクションを追加する必要があります。具体的には、前述のCOFF形式自体とCOFF形式の拡張の定義にあります。私は個人的にはセグメントテーブルの外観がa.outフォーマットに比べてCOFFフォーマットの最大の改善になるかもしれないと思います。以下では、COFFファイル内のセクションのデータ構造について簡単に説明します。セクションの意味はプログラムのコンパイルと接続に反映されるため、この記事ではこれ以上説明しません。さらに、ELF形式とCOFF形式は非常によく似たセクションを定義しているので、以降のELF形式の分析では説明を省略します。構造体COFF_scnhdr {char s_name [8]; /*セクション名* /char s_paddr [4]; /*物理アドレス* /char s_vaddr [4]; /*仮想アドレス* /char s_size [4]; /*セクション長* /char s_scnptr [4]; /*ファイルに対するセクションデータのオフセット* /char s_relptr [4]; /*セクション再配置情報offset * /char s_lnnoptr [4]; /*セクション情報offset * /char s_nreloc [2]; /*セクション再配置エントリ数* /char s_nlnno [2]; /*セクション情報項目数* /char s_flags [4]; /*セクションマーカ* /};
<注意すべき点が1つあります。Linuxシステムのヘッダファイルcoff.hのフィールドs_paddrに対するコメントは「物理アドレス」ですが、「メモリにロードされるセクション」が占めるスペースの長さとして理解されるようです。フィールドs_flagsは、テキストセグメント、データセグメント、BSSセグメントなどのようなセクションのタイプをマークする。 COFFセクションには、バイナリコードとソースコードの行番号の対応関係が記述されているので、デバッグ時に役立ちます。

参考文献19は、COFF形式の中国語による詳細な説明です詳細については、参考文献20を参照してください。




トップに戻る


参考文献1の著者は、セクションヘッダーについて説明しています。すべてのデータが0に設定され、プログラムは正しく実行されます。 ELFヘッダーは、このドキュメントのロードマップで、ファイル全体の構造を説明しています。以下は、ELFヘッダーのデータ構造です。zh-CN"],null,[1],zh-TW"]]]

Copyright © Windowsの知識 All Rights Reserved