我该如何在C语言中检查一个目标文件是COFF格式还是ELF格式?

8

我希望能够在我的C代码中检查对象文件的格式,以便根据文件是COFF还是ELF格式使用不同的读取函数。

这个有可能实现吗?如果可以,应该怎么做呢?

顺便说一下,这是在Linux下进行的,如果有任何区别,请告诉我。


5
试用一下libmagic,它是使用“magic”库的接口,同时也被“file”命令所使用。 - Marc B
3个回答

15

读取前四个字节。如果它们等于 \x7fELF,那么它就是一个 ELF 文件。否则,您应该将其解析为 COFF 并查看是否有意义。 (请注意,COFF 魔术值要复杂得多;在 /usr/share/file/magic 中我得到了不少于 42 个魔术值条目)。


5
我点了赞,但我不同意“否则就是COFF”的说法。如果ELF标识符不存在,那么它就不是ELF文件。但是这样说意味着当输入文件根本不是目标文件时会变成COFF,这有点牵强附会。 - mah
当然是可能的。在这种情况下,他将返回到COFF读取例程,如果不是COFF,则可能会失败。 - nneonneo
另一个问题是,确定COFF的好魔数似乎要困难得多。因此,更容易检查ELF,然后假设COFF并让COFF解析器自行解决。 - nneonneo
@nneonneo:使用相同的逻辑,他可以直接使用ELF例程,如果它不是ELF,则会失败,然后退回到COFF,最终返回错误... - m0skit0
当然,但你可以轻松地判断文件是否为ELF格式。(当然,ELF例程仍必须检查文件的完整性) - nneonneo
谢谢,这似乎是检查的最简单方法。唯一支持的类型是ELF和COFF,因此如果使用其他类型的文件,我也不想读取它,返回错误也没关系,因为COFF阅读器已经出现了这种情况。 - Chris

5
尝试使用命令file,它可以告诉您文件的类型。

6
虽然这是确定许多文件类型的有效方法,但它并不能回答问题(该问题要求从C中实现它的方法...而popen("file ...")将是一个相当差劲的解决方案)。 - mah

5

现有大约40个不同的COFF格式的魔数。理论上,操作员可以仅测试与目标架构相关的COFF,但总体而言,COFF并不容易测试。 - nneonneo
我已经在我的回答中说明了这一点。如果他想要准确,他别无选择,只能包括所有的魔数。 - m0skit0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接