我尝试编写一个程序来生成ELF(基于Arm并通过qemu-arm
执行)。 ELF中的大多数格式已得到充分说明
在wiki上。但我找不到任何规范来描述特殊部分的格式(例如.text
.data
(尤其是我想知道的内容)。
我试图在.data节中放置一些初始化的全局变量。如果我有int a = 10;
答案 0 :(得分:2)
.text
和.data
没有特殊格式。
当静态链接器链接多个.o
文件时,
.text
和.data
段(在解决重定位时).so
或可执行文件中(请参见gcc -Wl,-verbose /dev/null
)。 .data
段仅包含实例化的全局变量的初始值。
.text
段仅包含例程/函数的机器代码。
让我们看一下这个简单的C文件:
char x[5] = {0xba, 0xbb, 0xbc, 0xbd, 0xbe};
char f(int i) {
return x[i];
}
让我们编译它:
$ gcc -c -o test.o test.c
让我们使用elfcat转储.data节:
$ elfcat test.o --section-name .data | xxd
00000000: babb bcbd be .....
我们可以清楚地说明.data节的内容。
让我们转储.text部分:
$ elfcat test.o --section-name .text | xxd
00000000: 5548 89e5 897d fc8b 45fc 4898 488d 1500 UH...}..E.H.H...
00000010: 0000 000f b604 105d c3
我们将其反编译:
$ elfcat test.o --section-name .text > test.text
$ r2 -a x86 -b 64 -qc pd test.text
0x00000000 55 push rbp
0x00000001 4889e5 mov rbp, rsp
0x00000004 897dfc mov dword [rbp - 4], edi
0x00000007 8b45fc mov eax, dword [rbp - 4]
0x0000000a 4898 cdqe
0x0000000c 488d15000000. lea rdx, qword [0x00000013] ; 19
0x00000013 0fb60410 movzx eax, byte [rax + rdx]
0x00000017 5d pop rbp
0x00000018 c3 ret
同样,在文本段中没有什么特别的:它只包含我程序的例程/功能的机器代码。
但是请注意其他段中的重定位和符号信息:
$ readelf -a test.o
[ ... ]
Relocation section '.rela.text' at offset 0x1b8 contains 1 entry:
Offset Info Type Sym. Value Sym. Name + Addend
00000000000f 000800000002 R_X86_64_PC32 0000000000000000 x - 4
Relocation section '.rela.eh_frame' at offset 0x1d0 contains 1 entry:
Offset Info Type Sym. Value Sym. Name + Addend
000000000020 000200000002 R_X86_64_PC32 0000000000000000 .text + 0
[...]
Symbol table '.symtab' contains 10 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS test.c
2: 0000000000000000 0 SECTION LOCAL DEFAULT 1
3: 0000000000000000 0 SECTION LOCAL DEFAULT 3
4: 0000000000000000 0 SECTION LOCAL DEFAULT 4
5: 0000000000000000 0 SECTION LOCAL DEFAULT 6
6: 0000000000000000 0 SECTION LOCAL DEFAULT 7
7: 0000000000000000 0 SECTION LOCAL DEFAULT 5
8: 0000000000000000 5 OBJECT GLOBAL DEFAULT 3 x
9: 0000000000000000 25 FUNC GLOBAL DEFAULT 1 f