我为我糟糕的英语道歉,真的很难理解重定位部分的sh_info字段包含什么,以下是我从 ELF 文档中得到的信息:
它说
sh_info :包含应用重定位的节的节头索引
sh_link:包含相关符号表的节头索引。
很明显:sh_info 与重定位段相关的符号表段无关,其信息存储在 sh_link 中。
根据我的理解:重定位符号时,三个部分相关:重定位部分、符号表部分和包含符号表中符号定义的部分。
假设 1:所以我假设 sh_info 是关于前面提到的第三部分
-----但是,当我通过示例代码进行重定位时,我的假设似乎不匹配
static int elf_do_reloc(Elf32_Ehdr *hdr, Elf32_Rel *rel, Elf32_Shdr *reltab) {
Elf32_Shdr *target = elf_section(hdr, reltab->sh_info);
int addr = (int)hdr + target->sh_offset;
int *ref = (int *)(addr + rel->r_offset);
// Symbol value
int symval = 0;
if(ELF32_R_SYM(rel->r_info) != SHN_UNDEF) {
symval = elf_get_symval(hdr, reltab->sh_link, ELF32_R_SYM(rel->r_info));
if(symval == ELF_RELOC_ERR) return ELF_RELOC_ERR;
}
-----Sicce r_info是重定位部分中仅包含的字段
这意味着 sh_info 是重定位节本身的索引。<假设 2
更让我困惑的是别人发的一个例子,阅读elf文件的例子
似乎 sh_info 字段信息与我之前的两个假设无关
谁能帮忙解释一下 sh_info 真正包含什么?