我处理一些加载一组用户指定的共享对象的软件。 我想在我们的#34; loader"中添加一些代码。可以查询每个指定共享对象的组件 并找出用于构建/链接该共享对象的编译器和编译器版本。
过去,我已经能够使用"字符串-a | grep"方法如下所示。 但是,这种方法不适用于在AIX上使用g ++ 4.8编译的代码, 对于在x86 linux上使用g ++ 4.8编译的代码,它的工作效果不佳。
如果可能的话,我也希望找到一些更清晰的获取此信息的方法。
任何人都可以提供有关如何查询共享对象的构建它的编译器名称以及该编译器的版本的建议吗?
这是我当前技术的一些示例命令和输出:
在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上,我经常看到一个&#34; GNU&#34;在&#39;字符串中键入字符串-a&#39;输出我可以匹配。但是,在使用g ++ 4.8的power / aix上编译的libshareme.so上使用字符串-a并没有向我展示有关编译器版本的任何明显信息。
答案 0 :(得分:1)
我找到了这种方式,感谢同事检测是否在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
它
这种方法加上原始问题中的方法基本上可以让我编写检测编译器的代码(至少是我正在使用的编译器)以及加载失败期间编译器的任何潜在不匹配。
答案 1 :(得分:0)
不可能万无一失地做你想要达到的目标。您有时可能会找到编译器的随机标志或某些编译器标志,但肯定没有获得此信息的一般方法。大多数信息根本不存在于目标文件中(例如,我所知道的编译器没有存储用于目标文件的确切编译器标志)。
您可以查看其他软件包的作者所做的事情,我首先检查Perl。 Perl使用自己的&#34; ./ configure&#34;脚本,它收集不同工具的路径和要与它们一起使用的标志,然后在编译perl二进制文件和那里提供的标准模块时使用此信息。此信息也会被编译到perl二进制文件中,以后可以方便地打印(perl -V
),或者用于编译&#34;匹配&#34; perl自己的make helper库提供额外的perl模块(参见perl Makefile.PL
)。即使是perl的工具也不是万无一失的,因为你可能会尝试加载不兼容的编译/链接共享库。