【发布时间】:2014-12-21 09:34:56
【问题描述】:
我很抱歉我的英语不好,真的很难理解 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
更让我困惑的是别人发的一个例子,reading elf file example
似乎 sh_info 字段信息与我之前的 2 个假设无关
谁能帮忙解释一下 sh_info 真正包含什么?
【问题讨论】:
标签: elf relocation