我必须创建一个c ++程序来查明* .so(共享对象)文件是32位还是64位(例如libjvm.so)。我在Windows中为dll文件做了同样的事情,但是卡在非Windows共享对象文件上。
Linux中有许多命令可以找到它。但我没有看到一个简单的程序化方法来实现这一目标。命令objdump源代码有很多东西,不确定我可以在我的代码中复制它。
我不想在我的代码中使用系统("")函数调用命令来获取架构详细信息。
任何想法如何使用gnu c ++程序获取.so文件的架构。
我正在使用Linux RHEl 6.2和编译器GNU gcc 4.8.3。
由于
答案 0 :(得分:1)
了解ELF格式和elf(5)。然后,只需读取ELF标题并进行处理。
也许使用libelf
(甚至是libbfd
,这在你的情况下是过度的),但你可能甚至不需要它,你可以在某些fread
使用ElfN_Ehdr
1}}并使用ELF标题中的e_machine
和e_type
。
当然你可以用dlopen(3)加载共享对象,但是它确实从加载的插件中运行了一些(构造函数,它可能是function attribute)代码。然后使用dlsym(3),但要注意name mangling。
答案 1 :(得分:0)
在 openSUSE 42.3 objdump -f <your.so>
中,您会得到类似:
<your.so>: file format elf32-i386
architecture: i386, flags 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
start address 0x00003a80