gcc обнаруживает дубликаты символов / функций в статических библиотеках - PullRequest
5 голосов
/ 01 февраля 2012

Есть ли способ заставить gcc обнаружить дублированный символ в статических библиотеках по сравнению с основным кодом (или другой статической библиотекой?)

Вот ситуация:

main.c ошибочно содержал определение функции, например, с подписью uint foohash(const char*)

foo.c также содержит определение функции с подписью uint foohash(const char*)

foo.c и другие исходные файлы компилируются в статическую библиотеку утилит, в которую ссылается основная программа, т.е. что-то вроде:

 gcc -o main main.o util.o -L ./libs -lfooutils

Итак, теперь main.o и libs / libfooutils.a содержат функцию foohash. Предположительно, компоновщик нашел этот символ в main.o и не стал искать его где-либо еще.

Есть ли способ заставить gcc обнаружить такую ​​ситуацию?

Ответы [ 3 ]

3 голосов
/ 01 февраля 2012

Действительно, как заявил Саймон Рихтер, опция --whole-archive может быть полезна.Попробуйте изменить командную строку на:

 gcc -o main main.o util.o -L ./libs -Wl,--whole-archive -lfooutils -Wl,--no-whole-archive

, и вы увидите ошибку множественного определения.

2 голосов
/ 01 февраля 2012

gcc вызывает программу ld для связи.Соответствующие опции ld:

--no-define-common
--traditional-format
--warn-common

См. Справочную страницу для ld.Это должно быть то, с чем вам нужно поэкспериментировать, чтобы получить запрошенные предупреждения.

2 голосов
/ 01 февраля 2012

Краткий ответ: нет.

GCC на самом деле ничего не делает с библиотеками. Задача ld, компоновщика (автоматически вызываемого GCC) - извлекать символы из библиотек, и это действительно довольно тупой инструмент.

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

То, что вы можете сделать, - это трассировка ссылки (передать -t в gcc), чтобы увидеть, что и откуда. Или запустите nm для всех объектных файлов и библиотек в вашей системе и напишите сценарий для обнаружения дубликатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...