如何检查目标代码是否为 16/32 位?

How to check if a object code is 16/32 bit?

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

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

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

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

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

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

目前LinuxABI是可执行链接格式(ELF),可以使用readelf或objdump等工具查询特定的二进制文件。

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

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

这是 PE 格式的 Microsoft 规范:

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

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

维基百科有一个非常全面的列表,列出了所有已使用的流行可执行文件格式,以及指向更多信息的链接:

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