我有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 ??
答案 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运行时库)并将它们绑定在一起,对所有代码进行调整使用未定义的符号。
那么你最终得到的是一个可执行文件格式,其中所有符号都已知并且所有引用都已解析。