如何在C中读取对象文件?
假设有一个对象文件input.obj。在终端中,如果我执行“cat input.obj”,它会返回一些随机字符,如“?”A?J”。但当我“hextump”它时,它会显示我想读入程序的值 我将这个obj文件读入program.c,首先使用fopen打开它,然后使用fgetc逐字节读取。然而,它实际上读取的内容如“cat input.obj”所示,而我希望它读取的实际内容如hextump所示。有什么想法吗 代码片段(来自海报注释):如何在C中读取对象文件?,c,fgetc,C,Fgetc,假设有一个对象文件input.obj。在终端中,如果我执行“cat input.obj”,它会返回一些随机字符,如“?”A?J”。但当我“hextump”它时,它会显示我想读入程序的值 我将这个obj文件读入program.c,首先使用fopen打开它,然后使用fgetc逐字节读取。然而,它实际上读取的内容如“cat input.obj”所示,而我希望它读取的实际内容如hextump所示。有什么想法吗 代码片段(来自海报注释): 本质上,您需要打印每个字节的整数表示,以获得所需内容,而不是字节本
本质上,您需要打印每个字节的整数表示,以获得所需内容,而不是字节本身。试试这个:
char ch = ...; // Set ch to the value you read from the file
printf("%x", ch & 0xff);
&0xFF确保将值打印为1字节。这也是我所面临的问题。 令人惊讶的是,fopen和fgetc不会得到整个文本文件,并且在不解析整个对象文件的情况下会到达EOF 改用open()和read()系统调用。您可以使用手册页检查它们的语法 它们会为您提供整个对象文件,正如您所看到的那样
$hextump-C 1_hello.o向我们展示
fopen()
语句,因为有一些标志指定要打开的文件是二进制文件还是文本文件,如果不使用正确的模式,可能会破坏流中的内容。基本上,请提供代码。您需要使用二进制输入;或者是getc()
或者fread()
或者是他们的一个亲戚。您需要了解要模拟的文件结构hextump
。这涉及到理解Linux上的ELF格式,以及其他机器上的不同对象文件格式。您需要在感兴趣的不同机器上查找对象文件读取库。@JonathanLeffler我认为这些“对象文件”与已编译的elf文件无关。更有可能的是,它们只是二进制文件,OP碰巧调用对象(如果我错了,请纠正我,OP)。@Chris:你可能是对的,不过input.obj
可能是Windows对象文件。更严重的是,hextump
可能不会将对象文件解释为对象文件,而是将其解释为简单的二进制文件,对于这些文件,fgetc()
只要以二进制模式打开文件就可以了(这在Windows上很重要;当然在Unix上不重要)。我想用objdump
代替hextump
,原因不太清楚。既然char
在C中总是一个字节,为什么要屏蔽它?@AlexReynolds:char
在通过varargs时被提升为int
。另外,默认情况下,char
通常是signed
。
char ch = ...; // Set ch to the value you read from the file
printf("%x", ch & 0xff);