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

C program to open binary elf files, read from them, and print them out (like objcopy)

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

以下是使用 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, which can be found here