求助关键数据结构各个参数的具体解释

  • 不太理解题目里说的 value 还有 offset 分别代表什么。

如果value是对于所在节首地址的偏移,offset是对于目标地址首地址的偏移,那这个是不是算出来不太对?
这里红框框出来的符号 a 的 index 是 3,value 是 0,offset 是 304。序号为 3 的节 off 是 92。
但是 92+0 不等于 304 啊,我是哪里理解错了呢。

  • 不太理解节的 off 代表什么

这里序号为 1 和 0 的节的 off 分别是 0 和 64,addr 因为还没有合并所以都是 0,但是如果看 sectionByIdx 的话,两个地址相减差值是 256 而不是 64,这又是因为什么呢?

off 总是指当前这个对象在文件里的偏移量是多少。

在你的例子中,符号 aoffset为 304,这代表的意思是这个符号所在符号表上中的表项在文件中的偏移量为 304。而序号为 3 的节(也就是.data)的off是 92,且a的 value 为 0,此时说明变量a的存储空间在这个文件内从 92+0 开始。因为符号a 对应的 size 为 4,因此第 92~95 字节是用来存储 a 的初值也就是 1 的。

因此可以这样总结:符号表中的表项(也就是大家看到的 Symbol)指示的是这个符号的具体信息,而这个符号的存储空间在它的index 指示的节中。

我也有点疑惑
文档中给出的offset 定义是符号在目标文件中的偏移量
image

但是我看了下util.cc 源文件,发现 offset 的计算和符号表 (.symtab) 有关
感觉这里的 offset 指应该是符号"a"在符号表 (.symtab) 中的条目位置

而 92+0 是描述的符号 a 是一个初始化的全局变量需要存储在数据 (.data) 节中,感觉两者并不矛盾?

而且 (.symtab) 的 offset 确实是要小于 a 的 offset(304) 的

1 Like