我试图通过访问elf文件的sh_name
成员来获取部分名称的正确偏移量,但它一直给我零或null ...
我应该只使用mmap()
和elf.h
- 没有辅助函数
所以我做了:
void* map_start = mmap(0, fd_stat.st_size, PROT_READ | PROT_WRITE , MAP_SHARED, fd, 0))
header = (Elf32_Ehdr *) map_start;
secoff = header->e_shoff;
section = (Elf32_Shdr *)(map_start + secoff);
但是当我这样做时:
printf("name offset = %d\n", (section->sh_name));
它一直给我0 ... 我做错了什么?
答案 0 :(得分:19)
当我做
printf("name offset = %d\n", (section->sh_name));
时,它一直给我0 ...我做错了什么?
你没有任何错误。
sh_name
不是指针,它是.shstrtab
部分的偏移量,其中包含实际的部分名称。
您可以从.shstrtab
找到header->e_shstrndx
部分。
更新
不是假设将偏移量打印为int?
打印0
。是什么让你相信0
不是int?
但我要打印这个名字吗?
也许这个例子会解释?
#include <sys/stat.h>
#include <sys/mman.h>
#include <elf.h>
#include <stdio.h>
#include <fcntl.h>
int print_shdr(const char *const fname, size_t size) {
int fd = open(fname, O_RDONLY);
char *p = mmap(0, size, PROT_READ, MAP_PRIVATE, fd, 0);
Elf32_Ehdr *ehdr = (Elf32_Ehdr*)p;
Elf32_Shdr *shdr = (Elf32_Shdr *)(p + ehdr->e_shoff);
int shnum = ehdr->e_shnum;
Elf32_Shdr *sh_strtab = &shdr[ehdr->e_shstrndx];
const char *const sh_strtab_p = p + sh_strtab->sh_offset;
for (int i = 0; i < shnum; ++i) {
printf("%2d: %4d '%s'\n", i, shdr[i].sh_name,
sh_strtab_p + shdr[i].sh_name);
}
return 0;
}
int main(int argc, char *argv[])
{
struct stat st;
const char *fname = "/proc/self/exe";
if (argc > 1)
fname = argv[1];
if (stat(fname, &st) != 0) {
perror("stat");
return 1;
}
return print_shdr(fname, st.st_size);
}
$ gcc -g dump_shdr.c -m32 -std=c99
$ ./a.out
0: 0 ''
1: 27 '.interp'
2: 35 '.note.ABI-tag'
3: 49 '.note.gnu.build-id'
4: 72 '.hash'
5: 68 '.gnu.hash'
6: 78 '.dynsym'
7: 86 '.dynstr'
8: 94 '.gnu.version'
9: 107 '.gnu.version_r'
10: 122 '.rel.dyn'
11: 131 '.rel.plt'
12: 140 '.init'
13: 135 '.plt'
14: 146 '.text'
15: 152 '.fini'
16: 158 '.rodata'
17: 166 '.eh_frame'
18: 176 '.ctors'
19: 183 '.dtors'
20: 190 '.jcr'
21: 195 '.dynamic'
22: 204 '.got'
23: 209 '.got.plt'
24: 218 '.data'
25: 224 '.bss'
26: 229 '.comment'
27: 238 '.debug_aranges'
28: 253 '.debug_pubnames'
29: 269 '.debug_info'
30: 281 '.debug_abbrev'
31: 295 '.debug_line'
32: 307 '.debug_frame'
33: 320 '.debug_str'
34: 331 '.debug_loc'
35: 17 '.shstrtab'
36: 1 '.symtab'
37: 9 '.strtab'