ELF 文件中符号表的每一项都有一个st_value
可以表示该符号在所在段的偏移量。
重定位项的r_offset
所表示的也是符号所在段的偏移量;而重定位项里的r_info
里也包含了对符号表里某个符号的引用。
这样一来,st_value
和r_offset
是不是就是相同信息的两次表述了?
st_value; /* Value of the symbol */
r_offset; /* Location at which to apply the action */
r_info; /* index and type of relocation */
我觉得应该从功能上去区分,而不是从“值”上去区分。
我后来想到了这么一个理由:
这两者的信息确实是重复的,但是重定位表所在的 section 会一直存在,而符号表所在的 section 有可能会被 strip 掉。
系统里安装的各种 so 都是 strip 之后的(少了.symtab 和.strtab ),应用程序在加载的时候会从重定位表(.dynsym )去寻找符号。一般来说自己定义的函数和用到的外部函数引用也会在.dynsym 里。
我上个回答还是不对…
文不对题
其实我想说的是,这几个东西的“作用”并不是重复的。