0

私が知る限り、仕様に準拠している ELF を放出するツールがあります。Readelf の出力は問題ないように見えますが、objdump は何の逆アセンブルも拒否します。

デバッグを支援するために、入力を単一のグローバル var と "int main(void) { return 0;}" に簡略化しました。小さなセクション サイズは正しいです。

特に、objdump はセクション テーブルを見つけられないようです。

$ arm-none-linux-gnueabi-readelf -S davidm.elf 
There are 4 section headers, starting at offset 0x74:
Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .text             NULL            ff000000 000034 00001c 00  AX  0   0  4
  [ 2] .data             NULL            ff00001c 000050 000004 00  WA  0   0  4
  [ 3] .shstrtab         NULL            00000000 000114 000017 00      0   0  0

$ arm-none-linux-gnueabi-objdump -h davidm.elf 
davidm.elf:     file format elf32-littlearm
Sections:
Idx Name          Size      VMA       LMA       File off  Algn

また、まったく同じオブジェクトから構築された別の ELF もあり、通常のツールチェーンを使用してのみ生成されます。

$ objdump -h kernel.elf 

kernel.elf:     file format elf32-littlearm

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0000001c  ff000000  ff000000  00008000  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000004  ff00001c  ff00001c  0000801c  2**2
                  CONTENTS, ALLOC, LOAD, DATA

「既知の適切な」kernel.elf から .comment および .ARM.attributes セクション (objdump が必要とする場合) を削除した後でも、そこにセクションがリストされますが、ツールの davidm.elf にはリストされません。

readelf -x でセクションの内容が同じであることを確認しました。

私がイメージできる唯一のことは、ELF ファイルのレイアウトが異なっており、BFD のいくつかの期待に反していることです。これは、readelf (および私のツール) が問題なく処理するのに、objdump に問題がある理由を説明できます。

完全な読み取り:

ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0xff000000
  Start of program headers:          84 (bytes into file)
  Start of section headers:          116 (bytes into file)
  Flags:                             0x5000002, has entry point, Version5 EABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         1
  Size of section headers:           40 (bytes)
  Number of section headers:         4
  Section header string table index: 3

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .text             NULL            ff000000 000034 00001c 00  AX  0   0  4
  [ 2] .data             NULL            ff00001c 000050 000004 00  WA  0   0  4
  [ 3] .shstrtab         NULL            00000000 000114 000017 00      0   0  0
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

There are no section groups in this file.

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  LOAD           0x000034 0xff000000 0xff000000 0x00020 0x00020 RWE 0x8000

 Section to Segment mapping:
  Segment Sections...
   00     .text .data 

There is no dynamic section in this file.

There are no relocations in this file.

There are no unwind sections in this file.

No version information found in this file.

オンディスク レイアウトのアグレッシブなパッキングが問題を引き起こしている可能性はありますか? BFD が期待する、文書化されている、またはその他のバイトストリーム アラインメント制限に違反していますか?

最後に、このファイルはアドレス空間に mmap されることを意図したものではありません。ELF を小さく保つことはより重要です。

乾杯、 DavidM

編集:ファイルをアップロードするか、「objdump -x」を提供するように求められました。だから私は両方をやった: davidm.elf

$ objdump -x davidm.elf 

davidm.elf:     file format elf32-littlearm
davidm.elf
architecture: arm, flags 0x00000002:
EXEC_P
start address 0xff000000

Program Header:
    LOAD off    0x00000034 vaddr 0xff000000 paddr 0xff000000 align 2**15
         filesz 0x00000020 memsz 0x00000020 flags rwx
private flags = 5000002: [Version5 EABI] [has entry point]

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
SYMBOL TABLE:
no symbols
4

1 に答える 1

1

わかりました - ついにそれを理解しました。

小さなテスト アプリのコンテキストで libbfd (関数 elf_object_p()) をビルドし、注釈を付けてデバッグした後、BFD でサポートされているどのターゲットとも一致しない理由がわかりました。

セクション ヘッダーの sh_type フラグが不適切でした: NULL。必要に応じて STRTAB または PROGBITS (そして最終的には NOBITS を出力) を発行すると、objdump は喜んで私のイメージを歩きます。

振り返ってみると、それほど驚くことではありません-readelfの出力を比較する際にこれを見つけられなかったことに、何よりも腹を立てています:(

助けてくれてありがとう:)

于 2012-11-22T08:04:32.363 に答える