【问题标题】:C program to open binary elf files, read from them, and print them out (like objcopy)C 程序打开二进制 elf 文件,从中读取并打印出来(如 objcopy)
【发布时间】:2021-01-10 07:51:58
【问题描述】:

我正在尝试实现类似于 objcopy 的功能,其中将使用 open() 和 read() 打印出二进制文件的字节(特别是 .text 部分)。我将如何设置缓冲区大小并迭代到 .text 部分的末尾,这样我就不会读取比我必须读取更多的字节以避免错误?

【问题讨论】:

标签: c objcopy


【解决方案1】:

这是使用open() 和read() 读取文件的方法。

P.S 我使用 fopen() 和 fread() 而不是 open() 和 read() 因为我目前正在使用 Windows 机器。但是,两者的结果都是一样的。


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);
    }
}

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

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

#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);
}

我还建议查看elfutils library,可以找到here。

【讨论】:

  • 我不确定这是否能回答问题。这个问题特别是关于迭代 ELF 二进制文件的一部分。能够读取文件只是问题的开始,不是吗?
  • 感谢@KevinBoone 的提醒。我刚刚相应地更新了我的答案。
猜你喜欢
  • 2011-11-22
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 2019-05-13
  • 1970-01-01
  • 2015-08-18
  • 2013-11-25
相关资源
最近更新 更多