ELF中特殊部分的格式是什么
What is the format of special section in ELF
我尝试编写一个生成ELF的程序(基于Arm并通过qemu-arm
执行)。 ELF 中的大多数格式都有很好的说明
在 wiki 上。但是我找不到任何描述特殊部分格式的规范(例如.text
.data
(尤其是我想知道的))。
我试图将一些初始化的全局变量放入 .data 部分。如果我有像这样的全局语句,我应该在 ELF(.data 部分) 中写什么格式: int a = 10;
.text
和 .data
没有特殊格式。
当静态链接器链接多个.o
文件时,
- 它只是连接
.text
和 .data
段(同时解析重定位)
- 并根据链接描述文件(参见
gcc -Wl,-verbose /dev/null
)将它们放入最终的 .so
或可执行文件中。
.data
段仅包含实例化全局变量的初始值。
.text
段仅包含 routines/functions 的机器代码。
让我们以这个简单的 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
同样,文本段没有什么特别之处:它只包含我程序的 routines/functions 的机器代码。
但是请注意其他段中的重定位和符号信息:
$ 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
我尝试编写一个生成ELF的程序(基于Arm并通过qemu-arm
执行)。 ELF 中的大多数格式都有很好的说明
在 wiki 上。但是我找不到任何描述特殊部分格式的规范(例如.text
.data
(尤其是我想知道的))。
我试图将一些初始化的全局变量放入 .data 部分。如果我有像这样的全局语句,我应该在 ELF(.data 部分) 中写什么格式: int a = 10;
.text
和 .data
没有特殊格式。
当静态链接器链接多个.o
文件时,
- 它只是连接
.text
和.data
段(同时解析重定位) - 并根据链接描述文件(参见
gcc -Wl,-verbose /dev/null
)将它们放入最终的.so
或可执行文件中。
.data
段仅包含实例化全局变量的初始值。
.text
段仅包含 routines/functions 的机器代码。
让我们以这个简单的 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
同样,文本段没有什么特别之处:它只包含我程序的 routines/functions 的机器代码。
但是请注意其他段中的重定位和符号信息:
$ 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