1w2b3l 发表于 2014-04-24 11:27

有关重定位项的疑惑

每个目标文件都有两个重定位项集合,一个是文本段的,一个是数据段的(bss段被定义为全0, 因此没有什么需要重定位的。)

”每个目标文件都有两个重定位项集合“,我的理解是:

例如:
         全局变量 int global;
         本地局部变量 int local;

         代码为:value = local;

"文本段的重定位项"指的是:
value在输出文件中所在的内存位置(链接后的位于文本段中指令所在的虚拟地址),该赋值指令需要被修改,以正确反映value在数据段中的内存位置,把右值放到里面。
简而言之,就是二进制指令所加载到进程地址空间的内存地址。

"数据段的重定位项"指的是:
数据段被加载到进程地址空间后,value在数据段中的内存地址。

在链接过程的输入文件中,指令中对value的赋值需要value的准确地址,而数据段在进程地址空间的内存位置确定下来以后,才能修改引用了value的所有指令。

也就是说一个重定位项至少需要这两个信息,才能进行重定位,但是这里为什么说是两个重定位项,我理解有偏差还是就没理解!

疑惑啊,这样想至少自己觉得想通了一半,对不对,是不是确实反映了作者的意思,或者说链接器的处理方式,有待确认。

kkddkkdd11 发表于 2014-04-24 13:15

:))
说一下,我的理解

所谓的文本段应该是.text段
比如反汇编是call
这个xxx,就要根据程序加载base内存地址做重定位

所谓的数据段应该是.data段
比如反汇编是mov exa,
这个xxx,也要根据程序加载base内存地址做重定位

局部变量多放在栈上
全局变量多数放到.data中

l4rmbr 发表于 2014-04-24 14:28

1w2b3l 发表于 2014-04-24 11:27 static/image/common/back.gif
每个目标文件都有两个重定位项集合,一个是文本段的,一个是数据段的(bss段被定义为全0, 因此没有什么需要 ...

同一个编译单元里的数据或指令是不需要重定位的,只有一些待决的其他模块的数据或指令才需要重定们。所以说
每个目标文件都有两个重定位项集合,一个是文本段的,一个是数据段的。

1w2b3l 发表于 2014-04-27 17:36


mov exa, 是指令,位于文本段,作用是把eax中的值保存到xxx变量中

然而需要重定位的是xxx在指令中的地址,链接的时候修改为(重定位为)xxx加载到内存中的地址,

操作的重定位项仍然位于文本段,也就是文本段中该mov指令引用xxx的地方需要被重定位



1w2b3l 发表于 2014-04-27 17:41

同一个编译单元里的数据或指令是不需要重定位的,只有一些待决的其他模块的数据或指令才需要重定们。所以说
每个目标文件都有两个重定位项集合,一个是文本段的,一个是数据段的。

前半句理解,如果引用的变量或者函数不在同一个目标文件,那么发出引用的目标文件中的指令需要重定位。

然后就“所以”了,我就不明白了。

二者直接的因果关系我不明白。

怎么联系上的呢?
页: [1]
查看完整版本: 有关重定位项的疑惑