0

我有一个发射 ELF 的工具,据我所知,它符合规范。Readelf 输出看起来不错,但 objdump 拒绝反汇编任何东西。

我已将输入简化为单个全局变量,并使用“int main(void) { return 0;}”来帮助调试 - 小部分的大小是正确的。

特别是,objdump 似乎无法找到sections 表:

$ 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 期望的某些字节流对齐限制,记录在案或其他方面?

最后 - 这个文件不打算被映射到地址空间,加载程序会将段数据 memcpy 到所需的位置,因此不需要播放对 mmap 友好的文件对齐技巧。保持 ELF 小更重要。

干杯,大卫M

编辑:我被要求上传文件,和/或提供'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 回答