Ошибка связывания - один и тот же символ в разных общих библиотеках - PullRequest
0 голосов
/ 28 июля 2011

Я использую функцию regcomp () в моем коде. Мой код связан с libonig.so, а также с libc.so.6. Обе эти библиотеки имеют свои собственные реализации regcomp (), однако я хочу использовать реализацию из libonig.so. Тем не менее, мой код всегда использует реализацию из libc.so.6. Вывод ldd выглядит следующим образом -

ldd libtest.so

    linux-vdso.so.1 =>  (0x00007fffa03ff000)
    libonig.so.2 => /usr/local/lib/libonig.so.2 (0x00007f5cb2fbf000)
    libstdc++.so.6 => /usr/local/lib64/libstdc++.so.6 (0x00007f12a43cf000)
    libm.so.6 => /lib64/libm.so.6 (0x00007f12a414c000)
    libgcc_s.so.1 => /usr/local/lib64/libgcc_s.so.1 (0x00007f12a3f36000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f12a3be1000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003421c00000)

Мне не разрешено изменять любой из libonig.so или libc.so.6. Есть ли способ указать компоновщику, что regcomp () следует использовать из libonig.so?

1 Ответ

0 голосов
/ 28 июля 2011

Только что решил эту проблему.Я на самом деле использовал dlopen () для загрузки общего объекта (libtest.so).Поэтому я должен был связать libonig.so с бинарным файлом, который загружал libtest.so.

С другой стороны, я пытался связать libonig.so с libtest.so.Однако, когда исполнялся двоичный файл, он получил свою версию regcomp () из libc.so.6 и не счел необходимым разрешать символ с помощью libonig.so.Связывание libonig.so и включение его пути в LD_LIBRARY_PATH решило проблему.

...