我在开发一些加载一组用户指定的共享对象的软件。 我想向我们的“加载器”组件添加一些代码,该组件可以查询每个指定的共享对象 并找出用于构建/链接该共享对象的编译器和编译器版本。
在过去,我已经能够使用“strings -a | grep”方法,如下所示。 但是,这种方法不适用于在 power AIX 上使用 g++ 4.8 编译的代码, 对于在 x86 linux 上使用 g++ 4.8 编译的代码,它的工作效果不是特别好。
如果可能的话,我也很想找到比 grepping 字符串更简洁的方法来获取这些信息。
任何人都可以就如何查询共享对象以获取构建它的编译器的名称以及该编译器的版本提供建议吗?
这是我当前技术的一些示例命令和输出:
在 x86 linux g++ 4.1 编译的共享对象上:
$ strings -a libshareme.so | grep GNU
GCC: (GNU) 4.1.2 20080704 (Red Hat 4.1.2-50)
<etc>
(这里有很多重复的输出,但是很明显版本是GCC 4.1.2)
在强大的 AIX xlC v11 编译对象上
$ strings -a libshareme.so | grep XL
XL
IBM XL C/C++ for AIX, Version 11.1.0.6
IBM XL C/C++ for AIX, Version 10.1.0.6
(有点困惑,它显示了 v11 和 v10,但 XL C 很清楚)
在 x86 linux g++ 4.8 编译的共享对象上:
$ strings -a libshareme.so | grep GNU
GCC: (GNU) 4.4.6 20120305 (Red Hat 4.4.6-4)
GCC: (GNU) 4.8.2 20131111 (Red Hat 4.8.2-4)
GNU C++ 4.8.2 20131111 (Red Hat 4.8.2-4) -m32 -mtune=generic -march=i686 -g -fmessage-length=0 -fPIC
(这里也有点令人困惑,它显示了多个版本)
在强大的 AIX g++ 4.8 编译对象上
$ strings -a libshareme.so | grep GNU
<no output>
在 x86/linux 上,我通常会在可以匹配的“strings -a”输出中看到“GNU”类型的字符串。但是,在使用 g++4.8 在 power/aix 上编译的 libshareme.so 上使用 strings -a 并没有显示任何关于编译器版本的明显信息。
最佳答案
我发现这个方法多亏了一个同事来检测一个库是否在 AIX 上用 g++ 编译:
dump -X32_64 -Tv libshareme.so | grep libgcc
[1] 0x00000000 undef IMP DS EXTref libgcc_s.a(shr.o) __cxa_finalize
[2] 0x00000000 undef IMP DS EXTref libgcc_s.a(shr.o) __register_frame_info_table
[3] 0x00000000 undef IMP DS EXTref libgcc_s.a(shr.o) __deregister_frame_info
[4] 0x00000000 undef IMP DS EXTref libgcc_s.a(shr.o) __cmpdi2
[5] 0x00000000 undef IMP DS EXTref libgcc_s.a(shr.o) __gcc_qdiv
[6] 0x00000000 undef IMP DS EXTref libgcc_s.a(shr.o) __udivdi3
[7] 0x00000000 undef IMP DS EXTref libgcc_s.a(shr.o) _Unwind_Resume
[635] 0x20118d70 .data EXP DS Ldef [noIMid] __init_aix_libgcc_cxa_atex
它
这种方法加上原始问题中的方法基本上可以让我编写代码来检测编译器(至少是我正在使用的编译器)以及加载失败期间编译器的任何潜在不匹配。
关于c++ - 确定用于在 *ix 操作系统上构建共享对象的编译器和版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26371516/