C程序打开二进制elf文件,从中读取并打印出来例如objcopy

问题描述

我正在尝试实现类似于objcopy的功能,其中将使用open()read()打印出二进制文件(特别是.text节)的字节。我将如何设置缓冲区大小并进行迭代,直到.text节的末尾,以免读取的字节数过多,从而避免发生错误

解决方法

这是使用read()fopen()读取文件的方式。

P.S我使用fread()open()而不是read() int main() { FILE *file = fopen("input.txt","r"); char buffer[2048]; if (file) { /* Loop will continue until an end of file is reached i.e. fread returns 0 elements read */ while (fread(buffer,4,1,file) == 1) { printf("%s",buffer); } fclose(file); } } ,因为我当前正在使用Windows计算机。但是,两者的结果都相同。

#include <stdio.h>
#include <libelf.h>
#include <stdlib.h>
#include <string.h>
static void failure(void);
void main(int argc,char **argv)
{
    Elf32_Shdr *shdr;
    Elf32_Ehdr *ehdr;
    Elf *elf;
    Elf_Scn *scn;
    Elf_Data *data;
    int fd;
    unsigned int cnt;

    /* Open the input file */
    if ((fd = open(argv[1],O_RDONLY)) == -1)
        exit(1);

    /* Obtain the ELF descriptor */
    (void)elf_version(EV_CURRENT);
    if ((elf = elf_begin(fd,ELF_C_READ,NULL)) == NULL)
        failure();

    /* Obtain the .shstrtab data buffer */
    if (((ehdr = elf32_getehdr(elf)) == NULL) ||
        ((scn = elf_getscn(elf,ehdr->e_shstrndx)) == NULL) ||
        ((data = elf_getdata(scn,NULL)) == NULL))
        failure();

    /* Traverse input filename,printing each section */
    for (cnt = 1,scn = NULL; scn = elf_nextscn(elf,scn); cnt++)
    {
        if ((shdr = elf32_getshdr(scn)) == NULL)
            failure();
        (void)printf("[%d]    %s\n",cnt,(char *)data->d_buf + shdr->sh_name);
    }
} /* end main */

static void
failure()
{
    (void)fprintf(stderr,"%s\n",elf_errmsg(elf_errno()));
    exit(1);
}

更新:为了专门解释ELF文件,我建议您看一下以下资源:

查看以下code snippet。它显示了如何解释ELF文件。

useEffect

我还建议您检出elfutils libraryhere