编译器编译源代码后生成的文件叫做目标文件。
3.1 目标文件的格式是什么
可执行文件格式:
- PE Portable Executable (windows)
- ELF Executable Linkable Format (Linux)
目标文件:源代码编译后但未进行链接的哪些中间文件windows下的.obj和linux下的.o
1 | 使用file命令查看响应的文件格式 |
3.2 目标文件是什么样的
一般目标文件将信息按照不同的属性按照节的形式存储,有时候也叫段。
在一般情况下,他们都表示一个一定长度的区域,基本上不加以区分别。
代码段:.code .text ===> 程序指令
数据段: .data ===> 程序数据
- C语言编译后的执行语句都编译成机器代码,保存在.text段
- 已经初始化的全局变量和局部变量都保存在.data段
- 未初始化的全局变量和局部静态变量默认值都为0存在.bss段,.bss段只是预留空间没有内容,不占空间
3.3 挖掘SimpleSection.o
1 |
|
gcc -c SimpleSection.c
得到SimpleSection.o文件
objdump -h SimpleSection.o
查看目标文件的结构和内容
1 | Sections: |
属性分析:
- Size 段的长度
- File Off 段的位置
- CONTENTS、ALLOC等表示段的各种属性
OtherData | 0x00000450 |
---|---|
.comment | 0X000000a4 |
.rodata 1 | 0X000000a0 |
.data | 0X00000098 |
.text | 0X00000040 |
ELF Header | 0X00000000 |
有一个专门的命令叫做size,用来查看ELF文件的代码段、数据段和BSS段的长度,dec表示3个段长度的和的十进制,hex表示长度和的十六进制
size SimpleSection.o
1 | text data bss dec hex filename |
3.3.1 代码段
objdump -s 参数可以将所有端的内容以16禁止的方式打印出来
-d 参数可以将所有包含指令的段反汇编
objdump -s -d SimpleSection.o
1 | main.o: file format elf64-x86-64 |
3.3.2 数据段和只读数据段
- .data段保存的是那些已经初始化了的全局静态变量和局部静态变量
- .dodata端存放的是只读数据,一般是程序里面的只读变量,如const修饰的变量和
3.3.3 BSS段
.bss段存放的是未初始化的全局变量和局部静态变量
字符串常量