开发一个链接器(2)

开发一个链接器(2)

💡 原文中文,约9600字,阅读约需23分钟。
📝

内容提要

本文介绍了如何将多个ELF .o文件链接成一个可执行文件,包括模拟函数调用和重定位的过程,处理不同文件之间的函数调用和重定位,以及实现多文件链接器所需的额外工作。

🎯

关键要点

  • 本文介绍了如何将多个ELF .o文件链接成一个可执行文件。

  • 实现过程包括模拟函数调用和重定位的过程。

  • 处理不同文件之间的函数调用和重定位是关键。

  • 单文件输入时,所有内容由该文件提供,易于实现。

  • 多文件输入时,可能出现依赖情况,需要处理函数声明和定义。

  • 汇编语言中模拟函数调用的场景,展示了如何将代码分成多个文件。

  • 汇编器生成重定位信息,链接器根据这些信息填入正确的地址。

  • R_X86_64_PLT32和R_X86_64_PC32是重定位类型,涉及相对地址计算。

  • 链接器需要合并来自多个文件的同一section。

  • 需要完善对section的重定位处理,记录不同.o文件的section相对位置。

  • 维护符号表以找到符号对应的地址,计算重定位时使用。

  • 最终实现的链接器支持多个ELF .o文件的链接,代码量约400行。

延伸问答

如何将多个ELF .o文件链接成一个可执行文件?

通过解析输入的ELF文件,收集各个section的内容,规划文件布局,计算重定向,并将内容写入输出的ELF文件。

在链接多个文件时,如何处理函数调用和重定位?

需要处理不同文件之间的函数声明和定义,汇编器生成重定位信息,链接器根据这些信息填入正确的地址。

重定位类型R_X86_64_PLT32和R_X86_64_PC32有什么区别?

R_X86_64_PLT32涉及到过程链接表(PLT),而R_X86_64_PC32是基于程序计数器计算的相对地址偏移。

在实现多文件链接器时需要注意哪些额外工作?

需要合并来自多个文件的同一section,完善对section的重定位处理,并维护符号表以找到符号对应的地址。

如何在汇编语言中模拟函数调用?

通过将代码分成多个文件,并在入口函数中调用这些函数来实现,例如使用call指令。

链接器如何处理来自不同.o文件的section?

链接器需要合并来自不同.o文件的同一section,并记录各个section在内存中的相对位置。

➡️

继续阅读