2013-03-14 3 views
3

Я использую gnu gcc и armcc для компиляции нескольких файлов C. Как я могу получить информацию о том, какой компилятор скомпилировал файл?Какой компилятор, скомпилированный этот файл?

Ex: test.cpp скомпилирован armcc или gnu gcc.

Файл make очень сложный, и я ищу команду, с помощью которой я могу проверить, какой компилятор скомпилировал какой файл.

Любые идеи?

+0

У вас есть доступ к неопределенным объектным файлам? –

+0

Возможно, формат объектного файла может дать вам некоторые подсказки – paulm

+0

Да, у меня есть доступ к файлам .o – aditya3524

ответ

2

Иногда вы можете посмотреть файл с шестнадцатеричным редактором и указать, записал ли компилятор его имя в файл.

+0

Yup. Работает! Благодаря! – aditya3524

2

Я не уверен, если есть более простой способ, но вы можете найти его встраивается в двоичный файл с GCC (по крайней мере, на моей платформе):

$ hexdump -C foo | grep -A2 GCC 

00001030 00 00 00 00 00 00 00 00 47 43 43 3a 20 28 55 62 |........GCC: (Ub| 
00001040 75 6e 74 75 2f 4c 69 6e 61 72 6f 20 34 2e 37 2e |untu/Linaro 4.7.| 
00001050 32 2d 32 32 75 62 75 6e 74 75 33 29 20 34 2e 37 |2-22ubuntu3) 4.7| 
+0

Это не работает с исполняемыми файлами (или .o-файлами), скомпилированными с помощью gcc здесь (gcc на OS X). Это похоже на платформу. –

+0

@ RandyHoward: ах ок, спасибо. – teppic

+0

@ RandyHoward - хотя на самом деле это может быть из-за того, что он задрапирован за сценой? – teppic

0

Некоторые компилятор возможность размещения имя компилятора и версии в к в другом, но не все. Мы также можем вставлять любую информацию, которую хотим в двоичную.

gcc -DCOMPILER_DETAILS='"gcc 4.3.3"' temp.c 

В temp.c использовании макроса COMPILER_DETAILS в любом месте, как просто использовать его в printf. Чтобы этот строковый литерал был внедрен в сгенерированный двоичный файл. Не назначайте эту строку неиспользуемой переменной, компилятор не будет внедряться из-за оптимизации.