gpt4 book ai didi

c - Elf Symtab 解析空指针

转载 作者:行者123 更新时间:2023-11-30 19:52:30 25 4
gpt4 key购买 nike

我不想让别人帮我调试我的代码,但我真的坚持了下来。我有一个简单的代码片段,用于遍历 symtab 中的符号,然后将它们打印到控制台。显然,我在调用 printf 和 strcmp 时有一个空指针(导致段错误),但我似乎不明白为什么。这是代码片段:

    #include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <elf.h>
#include <fcntl.h>


#ifdef DEBUG
#define PRINTDEBUG(x) printf x //variable number of arguments
#else
#define PRINTDEBUG(x) do{} while(0)
#endif

uint32_t main(int argc, char** argv){
char* filename = argv[1];
char* sym_name = argv[2];
int fd = open(filename, O_RDONLY);
struct stat st;
stat(fd, &st);


char mem[st.st_size];
read(fd, mem, st.st_size);

Elf32_Ehdr* ehdr;
Elf32_Shdr* shdr; //generic entry for enumerating sections
Elf32_Shdr strtab; //holds string in symtab
Elf32_Shdr symtab;
char* sh_strtab; //hold sections names
Elf32_Sym* sym;


ehdr = (Elf32_Ehdr *)mem;
shdr = (Elf32_Shdr* )(mem + ehdr->e_shoff);
PRINTDEBUG(("number of section headers: %d\n", ehdr->e_shnum)); //need double brackets for variable #of arguments


sh_strtab = (char *)(mem + (shdr[ehdr->e_shstrndx].sh_offset));

//find address of symtab and strtab
for(int i = 0; i < ehdr->e_shnum; i++){
if(shdr[i].sh_size){

printf("%s\n", &sh_strtab[shdr[i].sh_name]);

if(strcmp(&sh_strtab[shdr[i].sh_name], ".strtab") == 0)
strtab = shdr[i];
if(strcmp(&sh_strtab[shdr[i].sh_name], ".symtab") == 0)
symtab = shdr[i];

}
}
PRINTDEBUG(("symtab offset %x\n", symtab.sh_offset));
PRINTDEBUG(("strtab offset %x\n", strtab.sh_offset));

char* symtab_str = (char *)(mem + strtab.sh_offset);
sym = (Elf32_Sym* )(mem + symtab.sh_offset);

printf("Symbol names: \n");
for(int i = 0; i < (symtab.sh_size / symtab.sh_entsize); i++, sym++){
printf("%x\n",&symtab_str[sym->st_name]);
if(strcmp(&symtab_str[sym->st_name], sym_name) ==0)
printf("not crahsed\n");

//TODO: resolve reloc'd syms
}
}

空指针出现在&symtab_str[sym->st_name]处。奇怪的是,我用调试器查看了程序集,它显示 &symtab_str[sym->st_name] 指向正确的值,即 .strtab 中的第一个字符串>.

编辑:发布了应该触发段错误的代码片段。使用 gcc 的“-m32”标志进行编译。提供 32 位 Elf 文件的路径名作为第一个运行参数。即

./symtab_parse test_file

我已经按照我最初的预期进行了工作。但是,我不确定段错误的原因,正如 EmployedRussian 所指出的,我最初的答案并不是问题的根本原因。我想真正了解这个谜团的真相,并希望从中学到一些东西。

最佳答案

As you can see, the address stored in eax points to the first string in .strtab, so why am I getting a null pointer when passing this to strcmp?

您显示的代码片段似乎是正确的,如果在调用 strcmpeax0xffd6a030,则 定义它不是NULL

您(没有证据支持)断言它是NULL似乎是错误的(换句话说,您可能误解了某些内容,并且您没有显示 那个东西)。

关于c - Elf Symtab 解析空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50423360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com