我有一个发射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
即使我从'known good'kernel.Self中剥离了.comment和.ARM.attributes部分(包括objdump需要它们),它仍然很乐意列出那里的部分,但不是在我的工具的davidm.elf中。
我已经确认两个部分的内容在readelf -x之间是相同的。
我唯一可以想象的是ELF文件布局不同并打破了对BFD的一些期望,这可以解释为什么readelf(和我的工具)处理它很好但是objdump有麻烦。
完整的readelf:
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'd到地址空间,加载器会将段数据存储到所需的位置,因此不需要播放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
答案 0 :(得分:1)
好的 - 终于明白了。
在一个小测试应用程序的上下文中构建和注释/调试libbfd(函数elf_object_p())之后,我发现为什么它在任何BFD支持的目标上都不匹配。
我的节标题有坏的sh_type标志:NULL。在适当的时候发出STRTAB或PROGBITS(当我走到那么远时,最终是NOBITS)并且愉快地走开我的形象。
回想起来并不令人惊讶 - 我更加恼火的是我在比较readelf输出时并没有发现这一点:(
感谢所有人的帮助:)