精灵读符号

Elf read symbols

我正在尝试从 .symtab 部分读取符号,但我似乎没有以正确的方式获取该部分。我已经阅读规范并在线搜索了一段时间。

为什么 symtab[i].st_name 为每个条目读取 0? 我正在读取的可执行文件有符号。


            Elf64_Half shdr_tab_size = ehdr->e_shentsize * ehdr->e_shnum;
            Elf64_Shdr shdr_tab[shdr_tab_size];

            rewind(infos.fp);
            fseek(infos.fp, ehdr->e_shoff, SEEK_SET);
            fread(&shdr_tab, 1, ehdr->e_shentsize * ehdr->e_shnum, infos.fp);

            char *shdr_names;
            shdr_names = malloc(shdr_tab[ehdr->e_shstrndx].sh_size);
            if (shdr_names != NULL) {
                fseek(infos.fp, shdr_tab[ehdr->e_shstrndx].sh_offset, SEEK_SET);
                fread(shdr_names, 1, shdr_tab[ehdr->e_shstrndx].sh_size, infos.fp);
            }

            Elf64_Shdr shdr_strtab = get_section_hdr(".strtab", shdr_tab, shdr_names, ehdr->e_shnum);
            Elf64_Shdr shdr_symtab = get_section_hdr(".symtab", shdr_tab, shdr_names, ehdr->e_shnum);

            if (shdr_symtab.sh_type == SHT_SYMTAB) {

                Elf64_Sym *symtab = malloc(shdr_symtab.sh_size);
                fseek(infos.fp, shdr_symtab.sh_offset, SEEK_SET);
                fread(symtab, 1, shdr_symtab.sh_size, infos.fp);

                char *strtab = malloc(shdr_strtab.sh_size);
                fseek(infos.fp, shdr_tab[shdr_symtab.sh_link].sh_offset, SEEK_SET);
                fread(strtab, 1, shdr_strtab.sh_size, infos.fp);

                // 10 is arbitrary, I did not figure out how to get the number of entries yet
                for (int i = 0; i < 10; i++) 
                printf("%s\n", strtab + symtab[i].st_name); // .stname reads 0
            }

编辑:

对于每个 symtab[i] 这就是我得到的。好像我哪里弄错了...

我已使用 nm 和其他工具进行验证,以确保符号和名称定义正确。

如果 st_name 为 0,则条目没有手册中描述的名称

st_name
An index into the object file's symbol string table, which holds the character 
representations of the symbol names. If the value is nonzero, it represents a string table
index that gives the symbol name. Otherwise, the symbol table entry has no name.

table开头部分条目为0是正常的。

如果您确定有带名称的符号,请尝试阅读所有条目并查看是否正确找到它们。条目数为shdr_symtab.sh_size / sizeof(Elf64_Sym)

此外,将 shdr_tab[shdr_symtab.sh_link].sh_offset 替换为 shdr_strtab.sh_offset,如下所示:

                char *strtab = malloc(shdr_strtab.sh_size);
                fseek(infos.fp, shdr_strtab.sh_offset, SEEK_SET);
                fread(strtab, 1, shdr_strtab.sh_size, infos.fp);