Различия в связывании поведения между Ubuntu и CentOS - PullRequest
0 голосов
/ 28 февраля 2019

Я создаю две общие библиотеки, одна библиотека (B) зависит от другой (A), и обе создаются с rpath из $ORIGIN/., затем связываю исполняемый файл с библиотекой B. Таким образом, зависимостиследующим образом:

исполняемый файл C -> библиотека B -> библиотека A

В Ubuntu зависимость B от A разрешается с помощью его rpath, тогда как в CentOS компоновщик предупреждает, что A не можетнайти, и я должен использовать «попробуйте использовать -rpath или -rpath-link» во время компиляции исполняемого файла.

Вот минимальный пример, чтобы воспроизвести проблему:

mkdir testdir
echo 'void a() {}' > testdir/a.c
echo 'int a(); void b() { a(); }' > testdir/b.c
echo 'int b(); int main() { b(); }' > testdir/c.c
gcc testdir/a.c -shared -o testdir/liba.so -Wl,-rpath,'$ORIGIN/.' -fPIC
gcc testdir/b.c -Ltestdir -la -shared -o testdir/libb.so -Wl,-rpath,'$ORIGIN/.' -fPIC
gcc testdir/c.c -Ltestdir -lb -o testdir/a.out

Какая разницамежду связыванием поведения в Ubuntu и CentOS вызывает эту проблему?Есть ли способ, которым я могу «исправить» это, так что A будет разрешен без необходимости полагаться на такие вещи, как LD_LIBRARY_PATH?


Обновление: Если я используюабсолютный путь к каталогу библиотеки вместо $ORIGIN, это похоже на работу.Конечно, я не знаю абсолютного пути, куда они будут развернуты, поэтому это не решает эту проблему, но указывает на то, что $ORIGIN не поддерживается CentOS 7 (или его загрузчиком).

1 Ответ

0 голосов
/ 01 марта 2019

Я думаю, что проблема здесь может быть этой ошибкой , о которой сообщалось в binutils 2.26, но предположительно присутствующей и в более ранних версиях.Проблема в том, что компоновщик ld, в отличие от динамического загрузчика ld.so, не интерпретировал специальную строку замены $ORIGIN в rpath, поэтому можно было использовать только абсолютный путь.

Ошибка былапомечены как исправленные в binutils 2.28, но в Centos 7 есть binutils 2.27.Ubuntu 18.4, с другой стороны, использует binutils 2.30.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...