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

标签 c++ linux

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

Linux 中有很多命令可以用来找出这个问题。但我没有看到一个简单的编程方式来获得它。命令 objdump 源代码有很多东西,不确定我是否可以在我的代码中复制它。

我不想在我的代码中使用 system("") 函数调用命令来获取架构细节。

知道如何使用 gnu c++ 程序获取 .so 文件的架构。

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

谢谢

最佳答案

了解 ELF格式和 elf(5) .然后,只需读取 ELF header 并对其进行处理即可。

也许使用libelf (甚至是 libbfd ,这在你的情况下是矫枉过正)但你可能甚至不需要它,你可以在某些 ElfN_Ehdr 上使用 fread 并使用 来自 ELF header 的 e_machinee_type

当然,您可以使用 dlopen(3) 加载共享对象,但这确实运行了一些(构造函数,它可能是 function attribute )来自加载插件的代码。然后使用 dlsym(3)但要注意name mangling .

关于c++ - 如何使用 gnu c++ 程序获取共享对象文件(.so 文件)的体系结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35424987/

相关文章:

linux - 汇编括号解释

copy_from_user - 难以从用户空间复制双指针

c++ - 当性能至关重要时,如何编写Linux C++调试信息?

C++模仿ls之类的命令

linux - 无法从 putty 中使用curl 下载 tar.gz 文件 : EC2

linux - pthread_kill() 在使用 nptl 库时出现段错误

c++ - strlen 的奇怪行为

c++ - 从网络摄像头流式传输 : is it normal that the frame does not have refcount?

c++ - 为什么要使用 umask?

sql-server - 在 Linux 中配置 ODBC 驱动程序