我在一些加载一组用户指定的共享对象的软件上工作。我想向我们的“加载器”组件添加一些代码,它可以查询每个指定的共享对象并找出用于构建/链接该共享对象的编译器和编译器版本。
过去,我可以使用“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)
在 Power 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
(这里也有点令人困惑,它显示了多个版本)
在 Power 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 并没有向我显示任何关于编译器版本的明显信息。