如何使用gnu c ++程序获取共享对象文件(.so文件)的体系结构?

时间:2016-02-16 06:07:10

标签: c++ linux

我必须创建一个c ++程序来查明* .so(共享对象)文件是32位还是64位(例如libjvm.so)。我在Windows中为dll文件做了同样的事情,但是卡在非Windows共享对象文件上。

Linux中有许多命令可以找到它。但我没有看到一个简单的程序化方法来实现这一目标。命令objdump源代码有很多东西,不确定我可以在我的代码中复制它。

我不想在我的代码中使用系统("")函数调用命令来获取架构详细信息。

任何想法如何使用gnu c ++程序获取.so文件的架构。

我正在使用Linux RHEl 6.2和编译器GNU gcc 4.8.3。

由于

2 个答案:

答案 0 :(得分:1)

了解ELF格式和elf(5)。然后,只需读取ELF标题并进行处理。

也许使用libelf(甚至是libbfd,这在你的情况下是过度的),但你可能甚至不需要它,你可以在某些fread使用ElfN_Ehdr 1}}并使用ELF标题中的e_machinee_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