如何测试共享 object 是 32 位还是 64 位?

How to test if a shared object is 32-bit or 64-bit?

我正在开发一个 C++ 应用程序,我需要在加载它之前测试 .SO 是 32 位还是 64 位。

我设法在 Windows 上进行了此评估,并获取了 Headers 文件。

现在我正在寻找一种在 Linux 中进行评估的方法。

最初我想使用 C++ 中的函数或方法来执行此操作,即不在外部程序(fileobjdump...)上调用 system()

如果我们的社区能帮我找到解决办法,我将不胜感激。

谢谢!

.so 个文件使用 ELF 格式。 ELF header 针对 32 位和 64 位平台有两种变体。文件包含这两个中的哪一个由文件中的字节 0x04 确定。 32 位格式为 1,64 位格式为 2

您可以简单地阅读和测试这个字节。

编译机器代码的实际指令集也可以从字节 0x12 和 0x13 确定,例如0x03 用于 x86,0x3E 用于 x86_64。请注意,这两个字节的字节顺序由字节 0x05 决定,对于小端字节序是 1,对于大端字节序是 2

另见 the wikipedia article on the ELF format

ELF File Format 保存该信息。所需要做的就是将文件读入缓冲区并遵循 ELF 格式布局(在链接的 wiki 中),读取 e_machine 字段。

免责声明:我是一个 Windows 人,如果有什么 Linux 不适用的具体内容,请通过评论告诉我。