ELF 链接和符号解析

主要观点:介绍了在进行cargo build等本地编译时,链接器的作用及不同平台的二进制格式(ELF、PE/COFF、Mach-O),详细阐述了ELF的链接过程,包括对象文件、符号、静态库、动态库等概念及链接顺序、重复符号和弱符号等情况。
关键信息:

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