12

いくつかのオブジェクトファイルにobjdumpの次の出力があります。

$ objdump -h main.o

main.o:     file format elf32-i386

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0000000b  00000000  00000000  00000034  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000000  00000000  00000000  00000040  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000000  00000000  00000000  00000040  2**2
                  ALLOC
  3 .note.GNU-stack 00000000  00000000  00000000  00000040  2**0
                  CONTENTS, READONLY, CODE

これらのフラグCONTENTS、ALLOC、LOADなどはどういう意味ですか?

4

2 に答える 2

28

表示されるのは、オブジェクト ファイル内の各セクションの ELF セグメント フラグ、セクション タイプ、およびセクション フラグの組み合わせの解釈です。

  • LOADセクションがロード可能なセグメントに存在することを意味します。つまり、その内容は、プロセスの作成時にファイルからメモリに読み込まれます。

セクション フラグは、System V Application Binary Interface の第 4 章で詳しく説明されていますが、示されている名前とは少し異なりobjdumpます。

  • CODEセクションに実行可能コードが含まれていることを意味します。SHF_EXECINSTRセクションヘッダーのフラグで示されます
  • DATAセクションが実行可能ではないが書き込み可能であることを意味し、SHF_WRITEフラグの存在によって示されます
  • READONLYセクションが実行可能でも書き込み可能でもないため、読み取り専用メモリ ページに配置する必要があることを意味します。
  • ALLOCSHF_ALLOCセクションがメモリを占有することを意味します。たとえば、フラグで示されるプロセスの作成時にセクションの内容を保持するためにメモリ ページが実際に割り当てられます。一部のセクション (デバッグ情報を含むセクションなど) は、通常のプログラム実行中にメモリに読み込まれず、ALLOCメモリを節約するようにマークされません。

タイプ のセクションにSHT_PROGBITSは、ファイル内に対応するコンテンツがあり、 として表示されCONTENTSます。一部のセクションには、ファイル内に対応するコンテンツがありません。たとえば、.bssタイプが のセクションSHT_NOBITSです。

この.textセクションには、プログラムの実行可能コードが含まれています。CONTENTSタイプなのでそのまま表示されSHT_PROGBITSます。このセクションは存在するためメモリを予約する必要がALLOCあり、その内容はファイルからロードする必要があります。これは、可能なLOADセグメントに配置されているためです。通常、プログラム コードは変更できないため、セクションは読み取り専用メモリに配置されます。実行される命令とCODEフラグが含まれています。

静的ストレージ クラスで初期化.dataされた変数がセクションに入ります。それらの初期値はファイルに保存され、プロセスの作成時にそこから読み取られます。C/C++ では、グローバル変数、静的ローカル変数、C++ 静的メンバー変数が適切に初期化されますstatic int a = 10;。Fortran は、初期化されたSAVE-d 変数とブロックを配置します。これらには、ブロックステートメントでCOMMON初期値が与えられます。DATA

.bssセクション (歴史的な名前、Block Started by Symbolの略語) は、最も単純なものです。初期化されていない変数を静的ストレージ クラスで保持します。これはタイプのセクションでありSHT_NOBITS、ファイル内でスペースを取りません。メモリはALLOCそのために割り当てられますが、メモリを事前設定するためにファイルから何も読み取られません。カーネルメモリアロケータによって提供されるとおり、すべてゼロのままです。

定数は通常.rodataセクションに入ります (この例に.dataはありません) READONLY

于 2012-06-25T20:43:46.637 に答える
4

に関する情報が見つかりましたUbuntu elf man page。これは私の理解です。と の両方からの情報だと
思います。program headersection header

LOAD: may correspond to PT_LOAD in the Program header table. Brief description:
It specifies the type of that particular element in the program header table.
The array element specifies a loadable segment

ALLOC: may correspond to SHF_ALLOC in the section table. Brief description:
Its specifies the flag of that particular element in the section header.
This  section  occupies  memory during process execution.

CODE/ DATA: indicates the belonging segment

READONLY: specifies a read-only segment

CONTENTS: I didn't find anything to conclude.

お役に立てれば

于 2012-06-25T20:32:01.113 に答える