Я работаю над некоторым программным обеспечением, которое загружает набор указанных пользователем общих объектов. Я хотел бы добавить некоторый код в наш компонент «загрузчик», который может запрашивать каждый указанный общий объект и выяснять, какой компилятор и какая версия компилятора использовалась для создания/связывания этого общего объекта.
В прошлом я мог использовать подход «strings -a | grep», как показано ниже. Однако этот подход не работает для кода, скомпилированного с помощью g++ 4.8 в мощной AIX, и он не очень хорошо работает для кода, скомпилированного с помощью g++ 4.8 в x86 linux.
Я также хотел бы найти более чистый способ получения этой информации, чем поиск строк, если это возможно.
Кто-нибудь может дать совет, как запросить у общего объекта имя компилятора, который его создал, а также версию этого компилятора?
Вот пример команды и результат моей текущей техники:
на скомпилированном общем объекте 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
(здесь также сбивает с толку то, что он показывает несколько версий)
на мощном скомпилированном объекте AIX g++ 4.8
$ strings -a libshareme.so | grep GNU
<no output>
На x86/linux я обычно вижу строку типа «GNU» в выводе «strings -a», который я могу сопоставить. Однако использование строк -a в этом libshareme.so, скомпилированном на power/aix с g++ 4.8, не показывает мне ничего очевидного в отношении версии компилятора.