参考
ELF
ELF(Executable Linkable Format)是Linux系统下的一种可执行可链接文件的格式,是COFF格式的变种。在Linux系统中包括了可重定位文件(.o文件),可执行文件(/bin/bash文件),共享目标文件(.so)和核心转储文件(core dump)。
ELF文件头(ELF Header):位于ELF文件的头部,包含了描述整个文件的基本属性。
代码段(.text):用于存放程序代码,只读属性
数据段(.data):用于存放程序中经初始化的全局变量和静态局部变量,读写属性
bss段(.bss)(Block Started by Symbol):用于存放程序中未经初始化的全局变量和静态局部变量。在目标文件中,这个段并不占据实际空间,它仅仅只是一个占位符。
实验
// test1.c
int a = 1;
static int b = 4;
int c;
static int d;
char *s1 = "1234";
int main()
{
int e = 2;
char *s2 = "3456";
return 0;
}
编译文件
gcc test1.c -o test1.o
查看编译后文件的信息
objdump -sx test1.o
摘取相关信息如下:
Sections:
Idx Name Size VMA LMA File off Algn
14 .rodata 0000000e 0000000000400550 0000000000400550 00000550 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
23 .data 00000020 00000000006008a8 00000000006008a8 000008a8 2**3
CONTENTS, ALLOC, LOAD, DATA
24 .bss 00000010 00000000006008c8 00000000006008c8 000008c8 2**2
ALLOC
Sections展示了不同的段的大小。
SYMBOL TABLE:
00000000006008bc l O .data 0000000000000004 b
00000000006008cc l O .bss 0000000000000004 d
00000000006008c0 g O .data 0000000000000008 s1
00000000006008d0 g O .bss 0000000000000004 c
00000000006008b8 g O .data 0000000000000004 a
SYMBOL TABLE展示了不同的变量是存在哪的。这里就可以看到
data段有:
- 初始化了的全局变量a
- 初始化了的静态变量b
- 常量字符串s1
而bss段有:
- 未初始化的全局变量c
- 未初始化的静态变量d
Contents of section .rodata:
400550 01000200 31323334 00333435 3600 ....1234.3456.
Contents of section .data:
6008a8 00000000 00000000 00000000 00000000 ................
6008b8 01000000 04000000 54054000 00000000 ........T.@.....
可以看到rodata段中有我们定义的1234和3456
而data段里有1和4(小端)分别对应a和b
还可以读取elf文件,命令是readelf