在C中查找elf的文本部分
获取Elf文件的文本部分并显示其内容的正确方法是什么?我自己也尝试过,但它只显示了250位数据,但当我尝试使用readelf命令时,它显示了更多。我想我只是做了一个错误的偏移来得到这个部分。什么是正确的方法 更新: 我补充了代码。现在,当我想要打印符号名时,它给了我分段错误 我想我只是做了一个错误的偏移来得到这个部分 您的程序迭代所有部分,因此在第一个循环结束时,在C中查找elf的文本部分,c,elf,C,Elf,获取Elf文件的文本部分并显示其内容的正确方法是什么?我自己也尝试过,但它只显示了250位数据,但当我尝试使用readelf命令时,它显示了更多。我想我只是做了一个错误的偏移来得到这个部分。什么是正确的方法 更新: 我补充了代码。现在,当我想要打印符号名时,它给了我分段错误 我想我只是做了一个错误的偏移来得到这个部分 您的程序迭代所有部分,因此在第一个循环结束时,sectHdr包含最后一个部分的部分标题,这不太可能是.text部分的标题 因此,在第二个循环中,您将打印恰好是最后一个部分的内容 要
sectHdr
包含最后一个部分的部分标题,这不太可能是.text
部分的标题
因此,在第二个循环中,您将打印恰好是最后一个部分的内容
要打印.text
节,您需要在遇到它时保存其节头
更新:
因此,如果我对所有部分执行for循环,然后对每个名称执行strcmp,当我发现与.text匹配时,我会保存该标题的地址 您不保存该标题的地址,而是保存内容 如果我想访问符号表,它不是节(有自己的类型:Elf32_Sym),我如何访问该表 符号表有自己的部分(包含一组
Elf32_Sym
记录)。看这个
更新2:
此代码:
if(strcmp(name, ".symtab") == 0) {
//symbolTable = (Elf32_Sym*)sectHdr.sh_addr;
symtab = (Elf32_Shdr*) §Hdr;
}
if(strcmp(name, ".strtab") == 0) {
strtab = (Elf32_Shdr *) §Hdr;
}
显然已损坏:您保存了一个指向内存的指针,在循环的每次迭代中都会覆盖该指针。您必须保存.symtab
和.strtab
节头的副本(就像您保存.text
一样)
更好的解决方案是
mmap
将整个文件保存到内存中。然后,您可以保存指向它各个部分的指针(这是另一个部分所做的--数据
指向mmap
ed区域的开始)。您可以使用libelf来读取elf文件。不,我不能,我只能使用elf.h库,其他什么都没有。这对Unix来说无关紧要,但您应该使用“rb”
二进制文件模式。“elf.h”是头文件,而不是库文件。附带的库是“libelf”,如果您使用它的任何对象(变量或函数),那么需要将它链接到您的程序,显然您不打算这样做。您似乎只使用了头文件的类型声明。请不要从问题中删除源代码!这会使你的问题变得毫无用处。因此,如果我对所有部分执行for循环,然后对每个名称执行strcmp,当我发现与.text匹配时,我会保存该标题的地址。如果我想访问符号表,它不是节(有它自己的类型:Elf32_Sym),我如何访问该表呢?我知道了,谢谢。我只是好奇链接代码中的“数据”变量是什么(类型,用于什么)。@danilo另一个问题中的data
变量是一个char*
变量,指向读取整个文件的缓冲区。因此ELF
头ELF
是(struct Elf64_Ehdr*)数据,节头shdr
是(Elf64_shdr*)(data+ELF->e_shoff)
,等等。我更新了代码,现在,当我想显示符号名称时,这给了我分段错误。在处理其余文件之前,我还应该检查幻数,以确保它确实声称是一个elf文件。