如何解决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 library的here。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。