Различные таблицы символов в разных версиях gcc вызывают неправильные связи

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

Подпись в моем исходном коде - Log(int, char *, char *, ...), а подпись в общей библиотеке - Log (int, int, char *,...)).

Код должен быть построен для разных целей. При сборке с использованием gcc-5.4.0 (Ubuntu 16.04) конфликт отсутствует, и разделяемая библиотека правильно вызывает функцию Log из разделяемой библиотеки. Однако при сборке на gcc-4.9.2 для armhf (BeagleBoneBlack) общая библиотека вызывает функцию Log в моем исходном коде, что неверно.

В частности, выходные данные команды nm, примененной к исполняемому файлу, сгенерированному с использованием gcc-4.9.2, показывают первую запись в таблице динамических символов следующим образом:

$ nm -D <filename>
00017590 T Log 
.....   

Эта запись для журнала не появляется при компиляции с gcc-5.4.0.

Я попытался использовать objcopy для подстановки имени символа журнала, пока создается файл.so, но это не работает.

Есть ли в Makefile какой-либо параметр или флаг, который необходимо добавить, чтобы любая версия gcc не добавляла функцию Log к динамическим символам моего окончательного исполняемого файла? Или я что-то здесь упускаю?

Воспроизведение настроек Makefile:

CFLAGS=-fPIC -MMD -Wall -std=c99 -D_GNU_SOURCE -g -Werror=implicit
CPPFLAGS=-Iinclude
CFLAGS+=-Os -fdata-sections -ffunction-sections -flto
CPPFLAGS+=-Os -fdata-sections -ffunction-sections -flto
LDFLAGS=-Os -Wl,--gc-sections -flto

0 ответов

Другие вопросы по тегам