链接
首先会用:
《为何需要链接?》
在汇编中我们总是需要通过跳转指令,到我们想要执行的地方去执行指令
那么我们如何指定跳转的位置呢?
汇编中通过符号表示
但是符号终究是符号,机器看不懂
在整个代码都定型后,无序改动后
我们就可以通过链接,将符号替换成
如:
这样的编号使得机器知道我们跳转的地方(编号实际上就是通过代码的行号得到的)
(注意代码没有定型时,代码的行数是不确定的,
这个时候链接,一旦代码改动,要跳转的位置又不对了
所以我们需要代一切确定后,再链接)
《链接的执行步骤》
如图现在有两个模块
这两个模块中都有符号应用
如图:
我们可以知道链接的过程还将不同模块的同一类部分进行了合并
从而可以使用原先在某一模块中的符号
我们可以知道 test.o是可重定向目标文件
其文件代码和数据地址都从0开始
为何经过链接后的可重定向目标文件变成可执行文件后,其代码和数据地址就变了呢?
因为这个时候程序已经固定下来了
程序需要被发到物理地址中,那么这之前就要知道其放到虚拟地址的哪个地方
通过图可知数据段和代码段放到虚拟地址的位置
为(只是这个例子中)
我们如果反汇编这个程序,看到第一个代码段的地址应该是这个虚拟地址的位置
即