重定位和符号表值

时间:2017-06-26 07:37:04

标签: c

我有main.c文件,其中包含对外部函数fun()的调用

int main()
{
 fun();
}

和readelf -r的结果如下

Relocation section '.rela.text' at offset 0x298 contains 3 entries:
Offset          Info           Type           Sym. Value    Sym. Name +Addend
00000000000a  000b00000002 R_X86_64_PC32     0000000000000000 fun - 4

我只是想知道信息字段(符号表条目)是如何映射的符号有趣以及为什么sym.value是0000 ??

1 个答案:

答案 0 :(得分:1)

请记住,C标准实际

使用单个翻译单元保存代码:

document.getElementById('submit').addEventListener('click', function(e) {
    e.preventDefault();
   var username = document.getElementById("username").value;

   data = {username: username};
   console.log(data);
   var request = new XMLHttpRequest();
   request.open('POST', '/getuser', true);
   request.setRequestHeader('Content-Type', 'x-www-form-urlencoded');
   request.send(data);
});

从该已编译(尚未链接)的目标文件中获得的信息基本上是:

int main() { fun(); }

那是因为知道 symbol status value ------ ------ ----- main defined pointer to main within object fun needed zero 在哪里,但没有关于main的信息 - 稍后需要找到它。因此,读取目标文件自然会返回fun的未知值。

当然,您还需要一些代码来定义fun,例如在另一个翻译单元中:

fun

编译会产生以下信息:

void fun(void) { puts("Hello, world."); }

链接阶段将这些联系在一起。它需要两个目标文件(以及任何其他依赖项的对象/库文件,例如包含symbol status value ------ ------ ----- fun defined pointer to fun within object puts needed zero 的C运行时库)并将它们绑定在一起,对所有代码进行调整使用未定义的符号。

那么你最终得到的是一个可执行文件格式,其中所有符号都已知并且所有引用都已解析。