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

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

undefined reference to `symbol@SOMELIB_1.0'

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

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

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


person sirgeorge    schedule 21.08.2013    source источник


Ответы (1)


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

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

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

Затем мне понадобился скрипт лайкера mylib.map, содержащий:

SOMELIB_1.0 {
    symbol1;
    symbol2;
};

Чтобы связать «mylib.so», мне нужно было передать дополнительный аргумент: -Wl,--version-script=mylib.map

person sirgeorge    schedule 21.08.2013