Существует ли способ знать, какой компилятор генерировал статическую библиотеку?

Я изменил строку 25 на:

await message.channel.send("lmao")

Кажется, сейчас работает:)

9
задан Mogsdad 10 September 2015 в 02:13
поделиться

4 ответа

Я склонен использовать 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 ...

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

2
ответ дан 4 December 2019 в 22:30
поделиться

Библиотека, как предполагается, является библиотекой C++ или C?

Если это - библиотека C, затем называют искажение, не может быть проблема, поскольку нет ни одного в C. Это могло быть однако в неправильном формате. Нельды раньше имели библиотеки в a.out формате, но почти всех более новых версиях, переключенных на более мощные форматы как ELF.

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

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

__ gxx_personality_v0

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

2
ответ дан 4 December 2019 в 22:30
поделиться

Извлеките объектные файлы из архива, затем выполненного 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 утилита или Полуночный Командующий использования (который интегрирует площадь), или можно просто работать strings на архиве (который мог бы дать Вам больше шума и быть менее релевантным, но все еще поможет.)

5
ответ дан 4 December 2019 в 22:30
поделиться

Можно попробовать файл утилиты Unix:

file foo.a
-1
ответ дан 4 December 2019 в 22:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: