- 论坛徽章:
- 0
|
本帖最后由 landker 于 2013-09-13 10:59 编辑
回复 21# sqfasd - 对于以下程序:
- extern g_function_1
- global g_L1
- [.data]
- l_abc db 4
- [.text]
- L0:
- ...........
- mov dword[l_abc], eax
- g_L1:
- ...........
- mov ebx, dword[l_abc]
- ...........
- call g_function_1
- ..........
复制代码 生成x86机器码时(即 *.o 文件),我只是将 g_function_1 和 L1(即 global和extern)这2个符号放入重定位表(没有将l_abc放入重定位表),使用gnu的ld进行链接,成功。
但是,当我自己写ld的时候,碰到了以下疑问(都是针对之前生成的 *.o 文件):
1)对于同一个符号,如:g_function_1,这是一个外部引用的函数,假如存在2句 call g_function_1,那对于重定位表而言,是否就该有对应的2条重定位记录?
2)对于局部变量(确切地说,是一个静态变量,作用域仅在 *.o 范围内),如:l_abc,是否应该将它放入重定位表?
对于1),我的理解是需要对应有2条重定位语句。原因是只有这样才能找到需要重定位的符号(因为同一个符号可能存在于多条不同的语句中)。
对于2),我之前并没有将它放入重定位表,在使用ld(gnu)链接后,发现l_abc已改变,其值为0x8049XXX(entry为:0x8048000),这算重定位吗?如果不算是重定位的话(事实上并没将l_abc放入重定位表),那它是如何实现的?
|
|