链接器实际修改了什么?

时间:2014-12-07 01:09:10

标签: linker loading machine-code

我无法确定链接器将修改哪些指令,哪些指令不会。我的教科书说那些将被修改的是那些其值被定义为程序的起始地址+ - 常量的教科书。它给出了以下2个mips的例子:

  1. j#源程序中有一些标签
  2. sw $ 5,结果#where结果是程序中的标签
  3. 然后说那些不需要修改的是表达式独立于程序起始地址的那些

    1. li $ l2,buffend-buffer#bufend和buffer是标签
    2. bne $ 2,$ 0,退出
    3. 我特别困惑,因为我认为bne是PC相对寻址,所以我认为这需要一个链接器。我认为我对连接器的理解是缺乏的,如果有人可以帮助我获得一些理解,我会非常感激。

      谢谢,

1 个答案:

答案 0 :(得分:0)

链接器...将对象blob链接到最终的二进制文件中。对象可能与位置无关。硬编码地址很好,但基于标签要么在编译/汇编时解析为位置无关,要么链接器在链接时解析它们。还有其他标签,如外部函数和全局变量,在汇编/编译时也无法解析,必须由链接器解析。

不仅仅是修改过的指令。根据指令集和指令,可以添加绝对地址,然后在.text中将其解析为.rodata,因此不仅可以插入指令,还可以插入地址或其他解决方案。根据工具链,链接器可能会添加指令和数据。

您的文本/教师可能会说中间向量表,因为可能已知使用外部标签,因此这些标签(地址)必须由链接器解析。但这只是大局的一个简单例子。