如果从可执行文件启动objdump -s,您会发现(在很多信息中):
Contents of section .interp:
400238 2f6c6962 36342f6c 642d6c69 6e75782d /lib64/ld-linux-
400248 7838362d 36342e73 6f2e3200 x86-64.so.2.
事实是,我真的很感兴趣:
400238
400248
让我们停止说话并观看代码:
void show_addr(t_all *all)
{
char *try;
char *secname;
int i;
size_t point;
unsigned int k;
i = 1;
all->shdr = (Elf64_Shdr *)(all->data + all->elf->e_shoff);
secname = (char *)(all->data + all->shdr[all->elf->e_shstrndx].sh_offset);
while (i < all->elf->e_shnum)
{
printf("Contents of section %s: \n", &secname[all->shdr[i].sh_name]);
try = (char *)(all->data + all->shdr[i].sh_offset);
point = all->shdr[i].sh_offset;
k = point;
while (k < (all->shdr[point].sh_size))
{
printf("%x\n", (unsigned int)all->shdr[k].sh_addr);
k += 16;
}
printf("\n");
i++;
}
}
当然,这段代码不会起作用,因为我已经陷入困境。 让我解释一下: secname用于显示该部分的名称,例如&#34; .interp&#34;在我的例子中。 所有这些都是我自己的结构,不同的信息在这里并不真正有用,期望调用Elf_64。 &#34;尝试&#34;和&#34;指向&#34;被迫使该部分的抵消(开始)。但是当我拥有它时,我不知道如何打印这个飞蛾** fu **** addr(我从一天开始就开始了)。