一 目标文件
(1). 编译器都做了什么
从源代码到可执行文件,基本上是顺序通过以下几步完成
- 预处理 -- 主要处理 以#开头的预编译指令,及删除注释等
- 编译 -- 将语法翻译成汇编语句
- 汇编编译 -- 将汇编语句变成机器码,转换后的文件叫 目标文件,一般后缀为 .obj(vc编译器) 或 .o(gcc等其他编译器)
- 链接 -- 为当前目标文件中 调用其他文件变量或函数 的地方 填入正确地址。然后转换为可执行文件。
其中 汇编编译后生成的 目标文件 是有一定格式的,并且 和 连接后生成的 可执行文件 格式基本是相同的。可以通过 binutils工具的objdump命令查看 目标文件内部结构。如下代码 <
如未特别一律是讨论 win下的 pe 文件结构 >
/*************************************/
// 可以通过 binutils工具的objdump命令查看 目标文件内部结构
// 可以通过 binutils工具的objdump命令查看 目标文件内部结构
// $ cl hello.cpp
// $ objdump -h hello.obj
// $ objdump -h hello.exe
/*************************************/
#include<stdio.h>
int global_userId = 555;
int global_userName;
void Say (int id )
{
printf("hello~ %d\n",id);
}
int main(int argc, char const *argv[])
{
int off = 2;
Say( global_userId + off );
return 0;
}
查看其目标文件结构为
/* obj 目标文件结构 */
hello.obj: file format pe-i386
Sections:
Idx Name Size VMA LMA File off Algn
0 .drectve 0000002f 00000000 00000000 00000104 2**0
CONTENTS, READONLY, DEBUGGING, EXCLUDE
1 .debug$S 0000007c 00000000 00000000 00000133 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA, DEBUGGING
2 .data 00000004 00000000 00000000 000001af 2**2
CONTENTS, ALLOC, LOAD, DATA
3 .bss 00000004 00000000 00000000 00000000 2**2
ALLOC
4 .rdata 0000000b 00000000 00000000 000001b3 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
5 .text 00000042 00000000 00000000 000001be 2**4
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
Sections:
Idx Name Size VMA LMA File off Algn
0 .drectve 0000002f 00000000 00000000 00000104 2**0
CONTENTS, READONLY, DEBUGGING, EXCLUDE
1 .debug$S 0000007c 00000000 00000000 00000133 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA, DEBUGGING
2 .data 00000004 00000000 00000000 000001af 2**2
CONTENTS, ALLOC, LOAD, DATA
3 .bss 00000004 00000000 00000000 00000000 2**2
ALLOC
4 .rdata 0000000b 00000000 00000000 000001b3 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
5 .text 00000042 00000000 00000000 000001be 2**4
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
/* exe 可执行文件结构 */
hello.exe: file format pei-i386
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00007250 00401000 00401000 00000400 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .rdata 0000462e 00409000 00409000 00007800 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .data 00000e00 0040e000 0040e000 0000c000 2**2
CONTENTS, ALLOC, LOAD, DATA
3 .reloc 00001184 00411000 00411000 0000ce00
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00007250 00401000 00401000 00000400 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .rdata 0000462e 00409000 00409000 00007800 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .data 00000e00 0040e000 0040e000 0000c000 2**2
CONTENTS, ALLOC, LOAD, DATA
3 .reloc 00001184 00411000 00411000 0000ce00