【问题标题】:How to check if a object code is 16/32 bit?如何检查目标代码是否为 16/32 位?
【发布时间】:2020-02-20 14:54:25
【问题描述】:

有什么方法可以识别.obj 文件和.exe 文件是16/32 位的吗?

基本上我想创建一个智能链接器,它会自动识别给定文件名需要传递给哪个链接器。

首选语言:C(如果需要,可以不同)

我正在寻找一些解决方案,可以读取.exe 的字节/.obj 文件的代码,然后确定它是否为 16/32 位。即使是算法也可以。

注意:我知道目标代码和可执行文件是两个不同的实体。

【问题讨论】:

  • 呃,16 位?你的意思是 32 位还是 64 位?
  • 不是真的...@Shawn,但了解一些区分 32 位和 64 位 obj/exe 的方法的知识会很棒。
  • 16bit 在嵌入式世界之外已经无关紧要了 25 年...
  • 没错……但这是我现在的要求。

标签: c c89 dosbox


【解决方案1】:

所有这些信息都根据相关的应用程序二进制接口 (ABI) 编码在二进制对象中。

目前的 Linux ABI 是 Executable and Linkable Format (ELF),可以使用 readelf 或 objdump 等工具查询特定的二进制文件。

当前的 Windows ABI 是可移植可执行文件 (PE) 格式。我不熟悉这里的工具集,但快速的谷歌搜索表明有些程序的功能与 readelf 相同:

http://www.pe-explorer.com/peexplorer-tour.htm

这是 PE 格式的 Microsoft 规范:

https://docs.microsoft.com/en-us/windows/win32/debug/pe-format

但是,这些格式都不再支持 16 位二进制文​​件。对于 Linux,较旧的 ABI 格式称为“a.out”,可以使用 objdump 读取和查询(我不确定 readelf)。较旧的 Windows/DOS 格式称为 MZ 和 NE。同样,我不熟悉这些旧 Windows 格式的工具支持。

维基百科有一个非常全面的列表,列出了所有流行的可执行文件格式,并附有更多信息的链接:

https://en.wikipedia.org/wiki/Comparison_of_executable_file_formats

【讨论】:

  • 抱歉不清楚。我已经更新了问题描述。感谢您宝贵的时间。
  • 我不确定这不能回答您的问题。例如,您可以识别 ELF 苍蝇,因为前三个字符是 ASCII 中的“ELF”。您可以识别 MZ 文件,因为前两个字符是 ASCII 中的“MZ”。等等。解析文件格式以获得您需要的内容。
  • 它是以 'E' 'L' 'F' 开头还是在特定偏移后找到?
  • 根据您的分类,我真的找不到两者之间的任何区别... 0x4d5a 对于一个 exe 是恒定的,而其他的变化与 16/32 规范无关。我可以请您抽出一些时间@David 吗?
  • Re "旧的 Windows/DOS 格式被称为 ME 和 NZ",你的意思是不是 MZNE
猜你喜欢
  • 1970-01-01
  • 2016-02-02
  • 2013-02-07
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
相关资源
最近更新 更多