2

出力セクションの説明に関するldマニュアルによると:

 section [address] [(type)] :
   [AT(lma)]
   [ALIGN(section_align) | ALIGN_WITH_INPUT]
   [SUBALIGN(subsection_align)]
   [constraint]
   {
     output-section-command
     output-section-command
     ...
   } [>region] [AT>lma_region] [:phdr :phdr ...] [=fillexp] [,]

アドレスまたは>regionは、VMA、つまり出力セクションの仮想メモリ アドレスを表します。

AT()またはAT>lma_regionは、LMA、つまり出力セクションのロード メモリ アドレスを表します。

そして、helloworld elf ファイルのセクション ヘッダープログラム ヘッダーreadelf -eをダンプするために、詳細なビューを取得することにしました。結果は以下のとおりです。

セクション ヘッダー

プログラムヘッダー

私の質問は次のとおりです。

  • ダンプされたヘッダーに LMA がないのはなぜですか? LMA は ELF ファイルでどのように表されますか?
  • 赤い長方形の Addr 列は何を意味していますか? VMA?
  • 緑色の長方形の PhysAddr は何を意味していますか?

追加 1

これまでのところ、PhysAddr は LMA のようです。

4

1 に答える 1

4

ダンプされたヘッダーに LMA がないのはなぜですか? ELF ファイルでの LMA の表現方法

まず、elf ファイル内に LMA ヘッダーはありません。実際には静かでシンプルです。ELF ファイル内の複数のセクションがセグメントにマップされます。たとえば、セグメントにマップされたセクションに LOAD フラグがある場合 (PROFBITS) はロード可能なセクション タイプであり、それらがマップされるセグメントは、ロード タイプ セグメント (INTERP および LOAD) でもあります。たとえば、ロード可能なセグメントでもあります。つまり、elf ファイル内のそのセグメント内のすべてのセクションがメモリにロードされます。どこ?与えられた VMA に対して単純に行われるため、elf ファイルには LMA はありません。LMA は、指定されたタイプ / フラグであるセクションをロードする必要がある VMA によって表されます。

赤い長方形の addr 列は何を意味していますか?

これは、あなたの前の質問、はい! と直接関係があります。これは VMA を意味します。これを適切に説明するには、ELF フォーマットが何らかのメモリ保護/メモリ セグメンテーションをサポートするアーキテクチャ用に設計されていることを理解する必要があります。すべてのセクションに独自のメモリ保護を与える代わりに、いくつかのセクションに特別な権限を与えたい場合があります。複数のセクションをセグメントにマップし、その唯一のセグメントに独自のメモリ保護を与えます。

これにより、セクションをセグメントにマップする必要が生じます.OSローダーは、各セクションをセグメントにマップする方法をどのように認識し、それによって適切なメモリ保護を提供しますか? その住所によって。各セクションにはアドレスも与えられ、それらのアドレス/オフセット/サイズによって、全体としてメモリに割り当てられるセグメントにマップされ、すべてのセクションに適用されるいくつかのメモリ保護ルールが与えられます。

OSがこれらをマップする方法を知ることができる唯一の方法はアドレスによるものであるため、セクションがロード可能なタイプの場合、ADDRはVMAを意味します(少なくとも、仮想メモリを使用し、elfファイルを悪用しない最新のシステムの場合)

PhysAddr とはどういう意味ですか?

私の知る限り、PhysAddr は、物理アドレッシングがユーザー空間プログラムに関連する旧式のアーキテクチャにのみ関連します。このセクションには、セグメントが配置される実際の物理アドレスが保持されますが、ほとんどの最新システムでは、これは単純に無視されます。 ..

このhttp://flint.cs.yale.edu/cs422/doc/ELF_Format.pdfを読むことをお勧めします。

個人的にこれを学んだ当時、それは私を大いに助け、ELF ファイルに関する多くの知識を与えてくれました。:)

于 2016-07-29T16:09:11.403 に答える