【发布时间】:2020-11-21 07:51:11
【问题描述】:
我尝试编写一个程序来生成ELF(基于Arm并通过qemu-arm执行)。 ELF 中的大多数格式都得到了很好的说明
在wiki。但是我找不到任何描述特殊部分格式的规范(例如.text.data(尤其是我想知道的))。
我试图将一些初始化的全局变量放在 .data 部分。如果我有如下全局语句,我应该在 ELF(.data 部分) 中写什么格式:int a = 10;
【问题讨论】:
标签: elf
我尝试编写一个程序来生成ELF(基于Arm并通过qemu-arm执行)。 ELF 中的大多数格式都得到了很好的说明
在wiki。但是我找不到任何描述特殊部分格式的规范(例如.text.data(尤其是我想知道的))。
我试图将一些初始化的全局变量放在 .data 部分。如果我有如下全局语句,我应该在 ELF(.data 部分) 中写什么格式:int a = 10;
【问题讨论】:
标签: elf
.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
让我们转储 .data 部分,使用 elfcat:
$ 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
【讨论】: