2009-04-07 3 views
9

Третья сторона предоставила мне статическую библиотеку lib (.a) для связи на станции Solaris. Я попытался скомпилировать с sunpro и не смог выполнить ссылку.Есть ли способ узнать, какой компилятор создал статическую библиотеку?

Я предполагаю, что проблема исходит от используемого компилятора (gcc вместо?) Или просто его версии (поскольку std lib, предоставленный компилятором, может измениться с версии, ожидаемой библиотекой AFAIK, это может привести к ошибкам в ссылке шаг).

Как я могу узнать, какой компилятор использовался для создания этой библиотеки? Есть ли какие-то инструменты? Какой-то вариант в sunpro/gcc или что-то еще?

Как подсказка: Я читал некоторое время назад, что компиляторы используют различные соглашения о манипуляции при создании объектных файлов (правда?). Тем не менее, «nm --demangle» командной строки хорошо печатает все имена функций из символов отладки в этой статической lib. Как это работает ? Если мое предположение нормально, nm действительно имеет способ решить, какое соглашение используется в статической библиотеке, не так ли? Или это просто означает, что lib был сгенерирован GNU gcc, поскольку nm является частью GNU binutils?

Я не близко к моей рабочей станции, так что я не могу скопировать & вставить вывод ошибок из линкера (не на данный момент, но я мог бы скопировать их в дальнейшем редактировать)

+1

Почему вы не спрашиваете у «третьей стороны», кто предоставил библиотеку инструкции о том, как ее использовать? – 2009-04-07 22:20:22

+0

Я спросил их. Но ответа от их команды поддержки, которая неохотно спрашивает команду разработчиков, кажется ...:/ –

ответ

2

Я предпочитаю использовать программу strings (с опцией «-a» или моим собственным вариантом, когда «-a» поведением является стандартным) и искать сигнальные знаки. Например, в одном из своих собственных библиотек, я считаю:

/work1/gcc/v4.2.3/bin/../lib/gcc/sparc-sun-solaris2.10/4.2.3/include 
/work1/gcc/v4.3.0/bin/../lib/gcc/sparc-sun-solaris2.10/4.3.0/include 
/work1/gcc/v4.3.1/bin/../lib/gcc/sparc-sun-solaris2.10/4.3.1/include 
/work1/gcc/v4.3.3/bin/../lib/gcc/sparc-sun-solaris2.10/4.3.3/include 

Это говорит о том, что код в библиотеке был составлен с различными версиями GCC в течение года (на самом деле я очень пораженный, чтобы найти так много версий в одной библиотеке).

Другая библиотека содержит:

cg: Sun Compiler Common 11 Patch 120760-06 2006/05/26 
acomp: Sun C 5.8 Patch 121015-02 2006/03/29 
iropt: Sun Compiler Common 11 Patch 120760-06 2006/05/26 
/compilers/v11/SUNWspro/prod/bin/cc -O -v -Xa -xarch=v9 ... 

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

-1

Вы можете попробовать утилиту UNIX файл:

file foo.a 
+0

Я пробовал, но я помню, это только говорит мне, что этот файл использует формат ELF для платформы SPARC. Получает ли sunpro формат ELF, как делает GCC? –

+0

Инструмент 'file' вряд ли вернет информацию о используемом компиляторе! – Enzo

2

должна ли библиотека быть C или C++ библиотека?

Если это библиотека C, тогда имя mangling не может быть проблемой, так как в C. ее нет. Возможно, это неправильный формат. Unices, используемые для библиотек в формате a.out, но почти все более новые версии переключились на более мощные форматы, такие как ELF.

Если это библиотека C++, тогда может возникнуть проблема с изменением имени. Большинство компиляторов внедряют некоторые символы, специфичные для компилятора, в код, поэтому, если у вас есть такой инструмент, как nm, чтобы перечислить символы, которые можно, как мы надеемся, вывести из того, с каким компилятором он пришел.

Например, г ++ создает символ

__gxx_personality_v0

в нем библиотек

4

извлечь объектные файлы из архива выполните команду strings на некоторых из них (в первую очередь на меньшие, так как будет меньше шума для просеивания). Многие компиляторы вставляют ASCII-подписи в объектные файлы.

Например, следующий бессмысленными исходный файл, foo.c:

extern void blah(); 

при компиляции на моей Fedora 10 машины в foo.o через gcc -c -o foo.o foo.c результатов в 647 байт файла в foo.o объекта.Запуск strings на foo.o результатов в

GCC: (GNU) 4.3.2 20081105 (Red Hat 4.3.2-7) 
.symtab 
.strtab 
.shstrtab 
.text 
.data 
.bss 
.comment 
.note.GNU-stack 
foo.c

, что делает его очистить компилятор GCC. Даже если бы я скомпилировал его с -fno-ident, раздел ELF с записью .GNU-стека все еще присутствовал бы.

Вы можете извлечь объектные файлы с помощью утилиты ar, или с помощью Midnight Commander (который объединяет аг), или вы можете просто запустить strings на архив (который может дать вам больше шума и быть менее значимыми, но все равно поможет .)

+0

Или просто запустите «строки» непосредственно в библиотеке - не нужно сначала извлекать объектные файлы. –

+0

Как я уже упоминал, в случае с объектами C++ есть намного больше вывода *, особенно *, и гораздо проще пропустить подписи компилятора. Кроме того, нет требования, чтобы все объекты в архиве были из одного и того же компилятора ... –