Как принудительно связать символ из определенной библиотеки?
При связывании исполняемого файла в 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