Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中查找elf的文本部分_C_Elf - Fatal编程技术网

在C中查找elf的文本部分

在C中查找elf的文本部分,c,elf,C,Elf,获取Elf文件的文本部分并显示其内容的正确方法是什么?我自己也尝试过,但它只显示了250位数据,但当我尝试使用readelf命令时,它显示了更多。我想我只是做了一个错误的偏移来得到这个部分。什么是正确的方法 更新: 我补充了代码。现在,当我想要打印符号名时,它给了我分段错误 我想我只是做了一个错误的偏移来得到这个部分 您的程序迭代所有部分,因此在第一个循环结束时,sectHdr包含最后一个部分的部分标题,这不太可能是.text部分的标题 因此,在第二个循环中,您将打印恰好是最后一个部分的内容 要

获取Elf文件的文本部分并显示其内容的正确方法是什么?我自己也尝试过,但它只显示了250位数据,但当我尝试使用readelf命令时,它显示了更多。我想我只是做了一个错误的偏移来得到这个部分。什么是正确的方法

更新: 我补充了代码。现在,当我想要打印符号名时,它给了我分段错误

我想我只是做了一个错误的偏移来得到这个部分

您的程序迭代所有部分,因此在第一个循环结束时,
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*) &sectHdr;
    }
    if(strcmp(name, ".strtab") == 0) {
        strtab = (Elf32_Shdr *) &sectHdr;
    }
显然已损坏:您保存了一个指向内存的指针,在循环的每次迭代中都会覆盖该指针。您必须保存
.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文件。