如何测试共享 object 是 32 位还是 64 位?
How to test if a shared object is 32-bit or 64-bit?
我正在开发一个 C++ 应用程序,我需要在加载它之前测试 .SO 是 32 位还是 64 位。
我设法在 Windows 上进行了此评估,并获取了 Headers 文件。
现在我正在寻找一种在 Linux 中进行评估的方法。
最初我想使用 C++ 中的函数或方法来执行此操作,即不在外部程序(file
、objdump
...)上调用 system()
。
如果我们的社区能帮我找到解决办法,我将不胜感激。
谢谢!
.so
个文件使用 ELF 格式。 ELF header 针对 32 位和 64 位平台有两种变体。文件包含这两个中的哪一个由文件中的字节 0x04 确定。 32 位格式为 1
,64 位格式为 2
。
您可以简单地阅读和测试这个字节。
编译机器代码的实际指令集也可以从字节 0x12 和 0x13 确定,例如0x03
用于 x86,0x3E
用于 x86_64
。请注意,这两个字节的字节顺序由字节 0x05 决定,对于小端字节序是 1
,对于大端字节序是 2
。
ELF File Format 保存该信息。所需要做的就是将文件读入缓冲区并遵循 ELF 格式布局(在链接的 wiki 中),读取 e_machine
字段。
免责声明:我是一个 Windows 人,如果有什么 Linux 不适用的具体内容,请通过评论告诉我。
我正在开发一个 C++ 应用程序,我需要在加载它之前测试 .SO 是 32 位还是 64 位。
我设法在 Windows 上进行了此评估,并获取了 Headers 文件。
现在我正在寻找一种在 Linux 中进行评估的方法。
最初我想使用 C++ 中的函数或方法来执行此操作,即不在外部程序(file
、objdump
...)上调用 system()
。
如果我们的社区能帮我找到解决办法,我将不胜感激。
谢谢!
.so
个文件使用 ELF 格式。 ELF header 针对 32 位和 64 位平台有两种变体。文件包含这两个中的哪一个由文件中的字节 0x04 确定。 32 位格式为 1
,64 位格式为 2
。
您可以简单地阅读和测试这个字节。
编译机器代码的实际指令集也可以从字节 0x12 和 0x13 确定,例如0x03
用于 x86,0x3E
用于 x86_64
。请注意,这两个字节的字节顺序由字节 0x05 决定,对于小端字节序是 1
,对于大端字节序是 2
。
ELF File Format 保存该信息。所需要做的就是将文件读入缓冲区并遵循 ELF 格式布局(在链接的 wiki 中),读取 e_machine
字段。
免责声明:我是一个 Windows 人,如果有什么 Linux 不适用的具体内容,请通过评论告诉我。