Как принудительно связать символ из определенной библиотеки?

При связывании исполняемого файла в Linux я получаю ошибку "неопределенная ссылка", например:

undefined reference to `symbol@SOMELIB_1.0'

У меня нет контроля над "SOMELIB", но у меня есть символ symbol в одной из моих собственных общих библиотек. Я абсолютно уверен, что symbol@SOMELIB_1.0 - это то же самое (обеспечивает точно такую ​​же функциональность), что и символ в моей библиотеке, на самом деле даже исходный код почти такой же.

Как заставить / псевдоним symbol@SOMELIB_1.0 быть связанным из моей библиотеки, а не из SOMELIB_1.0? Я думал о каких-то уловках версионирования символов в скрипте компоновщика, но я не мог найти никакого решения или даже подсказок.

Заранее спасибо.

1 ответ

После долгой борьбы (и поиска) я нашел решение здесь. Подводя итог: мне нужно было два символа. В моем исходном коде я положил что-то вроде этого:

__asm__(".symver symbol1, symbol1@SOMELIB_1.0");
void symbol1(void)
{
.....
}

__asm__(".symver symbol2, symbol2@SOMELIB_1.0");
void symbol2(void)
{
.....
}

Тогда мне нужен был скрипт liker mylib.map, содержащий:

SOMELIB_1.0 {
    symbol1;
    symbol2;
};

Для ссылки "mylib.so" мне нужно было передать дополнительный аргумент: -Wl,--version-script=mylib.map

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