1. CPP编译链接过程
预处理
处理以#开头的命令,纯文本替换,类型不安全
#pragma lib
和#pragma link
除外,#pragma lib
用于指定要链接的库,
#pragma link
用于指定程序入口(默认入口是main函数,但可以通过该命令修改)
都是在链接阶段进行处理
编译
词法分析,语法分析,代码优化,编译生成相应平台的汇编代码
汇编
将汇编代码转成特定平台的机器码,生成二进制可重定位的目标文件(*.obj),
链接
链接编译完成的所有.obj文件和静态库文件,分两步
- 所有.obj文件段的合并,其中符号表段合并后,进行符号解析
- 符号的重定位(重定向),这是链接的核心,最终生成可执行文件
可以参考书籍《深入理解计算机系统》第7章 链接的相关内容
相关的命令:
g++
编译的相关命令,可以使用-E
、-S
、-c
分别对源代码进行预处理,编译,汇编,分别生成对应的文件
命令 | 描述 |
---|---|
g++ -E source_filename.cpp -o output_filename.i |
生成预处理后的 CPP 源文件(.i 文件) |
g++ -S source_filename.cpp -o output_filename.s |
生成汇编代码文件(.s 文件) |
g++ -c source_filename.cpp -o output_filename.o |
生成目标文件(.o 文件) |
objdump
可用于查看目标文件或可执行文件的一些信息
命令 | 描述 |
---|---|
objdump -d 可执行文件 |
反汇编可执行文件,显示其汇编代码 |
objdump -t 可执行文件 |
显示可执行文件的符号表 |
objdump -r 可执行文件 |
显示可执行文件的重定位表 |
objdump -s 可执行文件 |
显示可执行文件的完整节(section)内容 |
objdump -h 可执行文件 |
显示可执行文件的节头表信息 |
objdump -x 可执行文件 |
显示可执行文件的全部信息 |