1

ELF32 バイナリにいくつかのカスタム コード変換を適用したいと考えています。最初に ELF ファイルを解析し、次に変換を適用します。その後、ELF セクションを新しい出力ファイルにまとめます。

変換の実装を開始する前に、ELF セクションを新しいバイナリ ファイルに書き戻すときに問題に遭遇しました。つまり、セクションを新しい ELF に書き込むときに、セクションを適切に配置する必要がありました。p_alignこの目的でプログラム ヘッダーからの値を使用しようとしましたが、正しくありません。p_offsetELF ファイルに書き込むときに使用する必要がある値のようですが、どのように計算されるかわかりません。

私が言いたいことの例を挙げましょう。次の単純な C コードがあります。

int main(int argc, char* argv[]){
  return 0;
}

GCC 4.8.2 を使用して 32 ビット ELF 実行可能ファイルをビルドしました。次にreadelf -h a.out、この ELF32 バイナリのプログラム ヘッダーを出力したところ、次の出力が得られました。

Elf file type is EXEC (Executable file)
Entry point 0x80482f0
There are 9 program headers, starting at offset 52

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  PHDR           0x000034 0x08048034 0x08048034 0x00120 0x00120 R E 0x4
  INTERP         0x000154 0x08048154 0x08048154 0x00013 0x00013 R   0x1
      [Requesting program interpreter: /lib/ld-linux.so.2]
  LOAD           0x000000 0x08048000 0x08048000 0x0056c 0x0056c R E 0x1000
  LOAD           0x000f08 0x08049f08 0x08049f08 0x00114 0x00118 RW  0x1000
  DYNAMIC        0x000f14 0x08049f14 0x08049f14 0x000e8 0x000e8 RW  0x4
  NOTE           0x000168 0x08048168 0x08048168 0x00044 0x00044 R   0x4
  GNU_EH_FRAME   0x000490 0x08048490 0x08048490 0x0002c 0x0002c R   0x4
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x10
  GNU_RELRO      0x000f08 0x08049f08 0x08049f08 0x000f8 0x000f8 R   0x1

この例を考えると、次の質問があります。

  1. p_offset特定のセグメントの正しい値をどのように計算しますか? p_offsetそもそもどうやって計算したの?

  2. p_align2 番目の LOAD セグメントがその値に関して位置合わせされていないのはなぜですか? 具体的には、なぜでは0x08049f08なくで始まるの0x08049000ですか?

  3. p_offsetがより小さくないのはなぜですか? ELF ファイル内でこれに先行するセクションはオフセット0xf08で終了し、ファイルにはこのセクションとで始まる次のセクション ( ) の間に 2460 ゼロ バイトがあるからです。とにかく、これらのセクション間に 2460 のゼロ バイトがあるのはなぜですか?eh_frame0x56Cinit_array0xf08

4

0 に答える 0