【问题标题】:How do I check if an object file is in COFF or ELF format from within C?如何从 C 中检查目标文件是 COFF 还是 ELF 格式?
【发布时间】:2012-10-01 02:45:15
【问题描述】:

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

这可能吗?如果可以,我该怎么做?

顺便说一句,这是在 Linux 中,如果这有什么不同的话。

【问题讨论】:

  • 试试 libmagic。这是一个使用'magic'库的接口,'file'命令也使用它。

标签: c linux elf coff


【解决方案1】:

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

【讨论】:

  • 我投了赞成票,但我不同意Otherwise it's COFF。如果不存在 ELF 魔法,则它不是 ELF 文件,但说明这意味着 if 的 COFF 我认为有点假设 - 例如,当输入文件根本不是对象时会发生什么。
  • 当然可以。在这种情况下,他会退回到 COFF 读取例程,如果不是 COFF,这可能会失败。
  • (另一个问题是为 COFF 确定一个好的幻数似乎要困难得多。因此检查 ELF 更容易,然后假设 COFF 并让 COFF 解析器找出它)跨度>
  • @nneonneo:使用相同的逻辑,他可以继续执行 ELF 例程,如果它不是 ELF,则会失败,然后回退到 COFF,然后出错...
  • 当然可以,但是您实际上可以轻松判断文件是否为 ELF。 (当然,ELF 例程仍然必须检查文件的完整性)。
【解决方案2】:

检查幻数。 ELF magic number is 0x7f454C46 (0x7f + "ELF") 和 COFF's is 0x14c。无论如何都要注意这一点,因为 COFF 有不同的幻数。

阅读这些值时要注意字节顺序。

【讨论】:

  • 现有的所有不同 COFF 格式都有 40 个不同的幻数。理论上,OP 可以只测试与他的目标架构相关的 COFF,但 COFF 通常并不容易测试。
  • 我已经在我的回答中说明了这一点。如果他想准确,他别无选择,只能包括所有幻数。
【解决方案3】:

尝试命令file。它告诉你文件的类型。

【讨论】:

  • 虽然这是确定许多文件类型的有效方法,但它确实不能回答问题(它要求从 C... 和 popen("file ...")非常糟糕的解决方案)。
猜你喜欢
  • 2011-12-26
  • 2010-12-19
  • 2016-03-17
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多