17

実行可能ファイルの ELF ファイルには、プログラム (セグメント) ヘッダーとセクション ヘッダーがあり、 で確認できますreadelf -a。次に例を示します。

ここに画像の説明を入力

ここに画像の説明を入力

上の 2 つの図は、それぞれセクション ヘッダーとプログラム (セグメント) ヘッダーです。セグメントヘッダーは、プログラムをメモリにロードするために使用されるいくつかのセクションヘッダーで構成されていることがわかります。

.text、.rodata、.data、.bss セクションだけをメモリにロードする必要がありますか?

セグメント内の他のすべてのセクション (たとえば、3 番目のセグメント内の .ctors、.dtors .jcr) は整列に使用されていますか?

4

1 に答える 1

23

セクションとセグメントは完全に2つの異なる概念です。セクションは、そこに格納されているデータのセマンティクス(つまり、データが何に使用されるか)に関係し、デバッグ目的を除いて、プログラムまたは共有ライブラリがリンクされると実際には無関係になります。セクションヘッダーを完全に削除する(またはランダムなゴミで上書きする)こともでき、プログラムは引き続き機能します。

セグメント(つまり、プログラムヘッダーロードディレクティブ)は、プログラムをロードするときにカーネルやダイナミックリンカが実際に見るものです。たとえば、あなたの場合、2つのロードディレクティブがあります。最初のものは、ファイルの最初の4k(1ページ)をアドレス0x08048000にマッピングし、このマッピングの最初の0x4b8バイトのみが実際に使用されることを示します(残りはアライメントです)。2つ目は、ファイルの最初の8k(2ページ)をアドレス0x08049000にマップします。その大部分はアライメントです。最初の0xf14バイトは、ロードディレクティブの一部ではなく(アライメントのみ)、無駄になります。0x08049f14から、ファイルからマップされた0x108バイトが実際に使用され、別の0x10バイト(0x118のMemSizeに到達するため)がローダー(カーネルまたはダイナミックリンカー)によってゼロで埋められます。これは、最大0x0804a02c(2番目のマップされたページ)に及びます。mallocヒープの一部として使用するためにそれを回復できる可能性があります)。

最後に、セクションヘッダーはまったく使用されませんが、プログラムの実行中に、さまざまなセクションの内容がプログラムによって使用される場合があります。のアドレス範囲.ctors.dtorsは2番目のロードマッピングの先頭にあるため、実行時にプログラムによってマップされ、アクセス可能であることに注意してください(C++または"GNUの場合、実行時の起動/終了コードはそれらを使用してグローバルコンストラクタとデストラクタを実行しますctor /dtor属性を持つC"コードが使用されました)。また.data、2番目のマップされたページのアドレス0x0804a00cから始まることに注意してください。これにより、再配置が適用された後、最初のページを読み取り専用で保護できます(プログラムヘッダーのRELROディレクティブ)。

于 2012-05-02T16:33:06.120 に答える