Слабое связывание со статическими библиотеками

Я объявил внешнюю функцию со слабым атрибутом GCC в файле .c:

extern int weakFunction( ) __attribute__ ((weak));

Скомпилированный объектный файл имеет weakFunction, определенный как слабый символ. Выход нм:

1791:         w weakFunction

Я вызываю слабо определенную функцию следующим образом:

if (weakFunction != NULL)
{
    weakFunction();
}

Когда я связываю программу, определяя объектные файлы в качестве параметров для GCC (gcc main.o weakf.o -o main.exe), слабые символы работают нормально. Если я оставлю weakf.o вне линковки, адрес функции будет NULL в main.c и функция не будет вызываться.

Проблема в том, что когда weakf.o находится внутри статической библиотеки, по какой-то причине компоновщик не находит функцию, и адрес функции всегда оказывается равным NULL. Статическая библиотека создается с помощью ar: ar rcs weaklibrary weakf.o

У кого-нибудь были подобные проблемы?


person Jaakko L.    schedule 13.04.2010    source источник


Ответы (1)


Хотя я не знаю точной работы слабых символов, похоже, вы получаете то, о чем просите: если никто другой не заставляет присутствовать weakFunction(), main() тоже не будет. Для меня это имеет смысл: если вы пытаетесь написать код, который работает как с наличием средства X, так и без него, то вы не хотите, чтобы ваш код принудительно включал X в вашу сборку любой ценой. Похоже, что "weak" предназначен для запроса если что-то присутствует, а не для запроса что что-то присутствует. Возможно, вы можете принудительно включить слабые символы с помощью «-u weakFunction» в качестве опции компоновщика в вашем случае.

person slartibartfast    schedule 13.04.2010
comment
Спасибо, эта информация помогла. На данный момент я буду использовать параметр --whole-archive, пока не найду лучший способ заставить символы быть связанными. Параметр -u не работал :(. - person Jaakko L.; 13.04.2010