Слабая связь со статическими библиотеками - PullRequest
4 голосов
/ 13 апреля 2010

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

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

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

1791:         w weakFunction

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

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

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

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

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

1 Ответ

4 голосов
/ 13 апреля 2010

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

...