【发布时间】:2018-02-16 19:50:05
【问题描述】:
我知道符号的名称在 shstrtab 中。 但我不知道如何抓住他们。 我应该将我的 shstrab 转换为 Elf64_Sym 以便我可以使用 st_name 吗?
Elf64_Shdr *shdr = (Elf64_Shdr *) (data + elf->e_shoff);
Elf64_Shdr *symtab;
Elf64_Shdr *shstrtab;
Elf64_Shdr *strtab;
char *str = (char *) (data + shdr[elf->e_shstrndx].sh_offset);
for (int i = 0; i < elf->e_shnum; i++) {
if (shdr[i].sh_size) {
printf("%s\n", &str[shdr[i].sh_name]);
if (strcmp(&str[shdr[i].sh_name], ".symtab") == 0)
symtab = (Elf64_Shdr *) &shdr[i];
if (strcmp(&str[shdr[i].sh_name], ".shstrtab") == 0)
shstrtab = (Elf64_Shdr *) &shdr[i];
if (strcmp(&str[shdr[i].sh_name], ".strtab") == 0)
strtab = (Elf64_Shdr *) &shdr[i];
}
}
str = (char *) shstrtab;
for (size_t i = 0; i < (symtab->sh_size / sizeof(Elf64_Sym *)); i ++) {
printf("%s\n", &str[shstrtab[i].sh_name]);
}
【问题讨论】:
-
我只知道是关于一些猫的......
-
听起来您对某些数据类型感到困惑。你应该发布一个代码 sn-p 来显示你卡在哪里,这样我们就可以看到你在做什么。
-
Elf64_Shdr *shdr = (Elf64_Shdr *) (data + elf->e_shoff); Elf64_Shdr *symtab; Elf64_Shdr *shstrtab; Elf64_Shdr *strtab; char *str = (char *) (data + shdr[elf->e_shstrndx].sh_offset); for (int i = 0; i e_shnum; i++) { if (shdr[i].sh_size) { if (strcmp(&str[shdr[i].sh_name], ".symtab") == 0) symtab = (Elf64_Shdr *) &shdr[i]; if (strcmp(&str[shdr[i].sh_name], ".shstrtab") == 0) shstrtab = (Elf64_Shdr *) &shdr[i]; if (strcmp(&str[shdr[i].sh_name], ".strtab") == 0) strtab = (Elf64_Shdr *) &shdr[i]; } }
-
您应该使用 ELF 库(
libelf.so或其他)来读取和分析数据。我不知道你认为“猫”在做什么——你打字的时候有没有人踩到你的键盘? -
我正在尝试在没有 flas 的情况下重新编码 nm