本专栏总结王利涛《C语言嵌入式Linux高级编程》第三期课程
文章目录
一、程序的编译、链接
二、可执行文件的组装
链接器将不同.o文件的相同段组合在一起
三、编译过程
1)特点
- 不是“一步到位”、“一气呵成”,而是环环相加;
- 分为预编译、编译、汇编、链接阶段;
- 每个阶段调用不同的工具去完成;
- 上一编译的输出作为下一编译阶段的输入。
2)输入与输出
- 预处理:源文件.c -----》处理后的源文件为 .i 文件
- 编译:源文件 .i -------》变成汇编文件 .s
- 汇编:汇编文件.s -------》生成目标文件.o
- 链接:可重定位目标文件 .o ---------》生成可执行目标文件(ELF格式)
四、思考
为什么不直接生成可执行文件?
- 1)GNU的思想:一个工具只干一件事情;
- 2)计算机工业思维:标准接口 + 分层
- 简化编译器的工作,提高工具的复用性;
- 适配更多的平台、CPU架构、指令集。
五、目标文件
1)目标文件
- objectfile
- 查看目标文件类型:file main.o /a.ou/test.so/test.a
2)分类
- 可重定位目标文件(relocatable files)
- 可执行目标文件(executable files)
- 可被共享目标文件(shared object file)
3)可执行文件(ELF)
- executable and linking format
六、ELF可执行文件结构
1)文件构成
- 由section组成,由section header table描述的一系列section集合;
- 查看节头表:$ readelf -S
- .text: 可执行指令代码;
- .data: 初始化的全局变量和静态局部变量;
- .bss : 未初始化的全局变量;
- .rodata: 字符串、常量及printf打印的字符串常量等;
2)描述信息
- ELF header:描述文件类型、要运行的处理器平台等信息;
- program header table:描述一个文件中由哪些段segment, 一个段通常由几个section组成,段是给加载器使用的;
- section header table:描述文件中有哪些section,section是给链接器使用的;
- .strtab: 字符串表,存放函数名、变量名,用于调试,反汇编;
- .symtab: 符号表,存放符号的地址等。