主要观点:介绍了在进行cargo build
等本地编译时,链接器的作用及不同平台的二进制格式(ELF、PE/COFF、Mach-O),详细阐述了ELF的链接过程,包括对象文件、符号、静态库、动态库等概念及链接顺序、重复符号和弱符号等情况。
关键信息:
- 编译器读取并检查源代码后生成原生机器码,链接器将各编译单元组合成完整程序,链接器行为与平台二进制格式相关。
- ELF的主要二进制格式,还介绍了其他平台的二进制格式。
- 定义了对象文件(
*.o
)、符号、静态库(lib*.a
)、动态库(lib*.so
)等概念。 - 链接器通过命令行参数配置,处理输入文件,添加符号定义和引用到符号表。
- 链接顺序在对象文件和库之间有所不同,静态库中每个对象文件也有特定处理方式。
- 对于重复符号,对象文件和静态库中只允许一个定义,共享库中多个定义时第一个定义有效,弱符号可用于控制符号选择。
重要细节: - 编译器生成对象文件,包含函数和数据及未定义符号引用,链接器处理输入文件并添加符号到符号表。
- 链接器按顺序处理输入,库的处理方式类似对象文件,动态库在运行时加载。
- 静态库中只有满足符号的对象文件才会被读取链接,使用
--start-group
和--end-group
可解决链接顺序问题。 - 弱符号可用于控制符号选择,对象文件或静态库中的非弱符号可覆盖弱符号,共享库中的情况不同。
- 可通过实验或编写自己的链接器来深入理解链接过程,MaskRay的博客是关于ELF链接器的宝贵资源。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。