Изменить путь поиска для разделяемой библиотеки на rpath, предоставленный в Makefile - PullRequest
0 голосов
/ 05 октября 2018

Я использую C ++ - разделяемую библиотеку libA.so, для которой требуется libB.so.1.0, в то время как в моей системе установлено libB.so.2.0.

Я не могу изменить это или добавить какие-либо файлы в / usr / lib / или / lib /.

Я перенес libB.so.1.0 в свою локальную папку lib и связал приложение с ней с помощью rpath.Однако этот путь не используется для поиска libB.so.1.0 для libA.so (но rpath используется для других разделяемых библиотек, которые связаны напрямую).Chrpath может использоваться только для изменения существующего rpath, но эта библиотека использует системный путь поиска.Поэтому я считаю, что это не вариант.

Вопрос в следующем: Есть ли способ распространения моего набора rpath в моем Makefile на косвенно включенную библиотеку libB.so.1.0 иесли нет, какие другие опции у меня есть, желательно без установки LD_LIBRARY_PATH вручную?

ldd-Ouput (для libA.so) выглядит так:

 11118: find library=libboost_system.so.1.58.0 [0]; searching
11118:   search cache=/etc/ld.so.cache
11118:   search path=/lib/x86_64-linux-gnu/tls/haswell/x86_64:/lib/x86_64-
linux-gnu/tls/haswell:/lib/x86_64-linux-gnu/tls/x86_64:/lib/x86_64-linux-
gnu/tls:/lib/x86_64-linux-gnu/haswell/x86_64:/lib/x86_64-linux-gnu/haswell:
/lib/x86_64-linux-gnu/x86_64:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-    
gnu/tls/haswell/x86_64:/usr/lib/x86_64-linux-gnu/tls/haswell:/usr/lib/x86_64-
linux-gnu/tls/x86_64:/usr/lib/x86_64-linux-gnu/tls:/usr/lib/x86_64-linux-
gnu/haswell/x86_64:/usr/lib/x86_64-linux-gnu/haswell:/usr/lib/x86_64-linux-
gnu/x86_64:/usr/lib/x86_64-linux-gnu:/lib/tls/haswell/x86_64:/lib/tls/haswell:
/lib/tls/x86_64:/lib/tls:/lib/haswell/x86_64:/lib/haswell:/lib/x86_64:
/lib:/usr/lib/tls/haswell/x86_64:/usr/lib/tls/haswell:/usr/lib/tls/x86_64:
/usr/lib/tls:/usr/lib/haswell/x86_64:/usr/lib/haswell:/usr/lib/x86_64:
/usr/lib        (system search path)
 11118:   trying file=/lib/x86_64-linux-gnu/tls/haswell/x86_64/libboost_system.so.1.58.0
 11118:   trying file=/lib/x86_64-linux-gnu/tls/haswell/libboost_system.so.1.58.0
 11118:   trying file=/lib/x86_64-linux-gnu/tls/x86_64/libboost_system.so.1.58.0
 11118:   trying file=/lib/x86_64-linux-gnu/tls/libboost_system.so.1.58.0
 11118:   trying file=/lib/x86_64-linux-gnu/haswell/x86_64/libboost_system.so.1.58.0
 11118:   trying file=/lib/x86_64-linux-gnu/haswell/libboost_system.so.1.58.0
 11118:   trying file=/lib/x86_64-linux-gnu/x86_64/libboost_system.so.1.58.0
 11118:   trying file=/lib/x86_64-linux-gnu/libboost_system.so.1.58.0
 11118:   trying file=/usr/lib/x86_64-linux-gnu/tls/haswell/x86_64/libboost_system.so.1.58.0
 11118:   trying file=/usr/lib/x86_64-linux-gnu/tls/haswell/libboost_system.so.1.58.0
 11118:   trying file=/usr/lib/x86_64-linux-gnu/tls/x86_64/libboost_system.so.1.58.0
 11118:   trying file=/usr/lib/x86_64-linux-gnu/tls/libboost_system.so.1.58.0
 11118:   trying file=/usr/lib/x86_64-linux-gnu/haswell/x86_64/libboost_system.so.1.58.0
 11118:   trying file=/usr/lib/x86_64-linux-gnu/haswell/libboost_system.so.1.58.0
 11118:   trying file=/usr/lib/x86_64-linux-gnu/x86_64/libboost_system.so.1.58.0
 11118:   trying file=/usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0
 11118:   trying file=/lib/tls/haswell/x86_64/libboost_system.so.1.58.0
 11118:   trying file=/lib/tls/haswell/libboost_system.so.1.58.0
 11118:   trying file=/lib/tls/x86_64/libboost_system.so.1.58.0
 11118:   trying file=/lib/tls/libboost_system.so.1.58.0
 11118:   trying file=/lib/haswell/x86_64/libboost_system.so.1.58.0
 11118:   trying file=/lib/haswell/libboost_system.so.1.58.0
 11118:   trying file=/lib/x86_64/libboost_system.so.1.58.0
 11118:   trying file=/lib/libboost_system.so.1.58.0
 11118:   trying file=/usr/lib/tls/haswell/x86_64/libboost_system.so.1.58.0
 11118:   trying file=/usr/lib/tls/haswell/libboost_system.so.1.58.0
 11118:   trying file=/usr/lib/tls/x86_64/libboost_system.so.1.58.0
 11118:   trying file=/usr/lib/tls/libboost_system.so.1.58.0
 11118:   trying file=/usr/lib/haswell/x86_64/libboost_system.so.1.58.0
 11118:   trying file=/usr/lib/haswell/libboost_system.so.1.58.0
 11118:   trying file=/usr/lib/x86_64/libboost_system.so.1.58.0
 11118:   trying file=/usr/lib/libboost_system.so.1.58.0

1 Ответ

0 голосов
/ 06 октября 2018

Я переместил libB.so.1.0 в мою локальную папку lib и связал приложение с ней, используя rpath.Однако этот путь не используется для поиска libB.so.1.0 для libA.so (но rpath используется для других разделяемых библиотек, которые связаны напрямую).

Это ожидаемое поведение приприложение имеет RUNPATH (что является более новым значением по умолчанию, если во время ссылки указано -rpath).

Вместо этого требуется «рекурсивное» поведение RPATH. Документация , объясняющая разницу.

Шаг 1: убедитесь, что ваше приложение действительно использует RUNPATH:

readelf -d a.out | egrep 'RPATH|RUNPATH'

Шаг 2: используйте -rpath=... -Wl,--disable-new-dtags, чтобы связать вашприложения и подтвердите, что RPATH теперь используется.

Шаг 3: убедитесь, что libB.so.1.0 теперь найдено.

Наслаждайтесь: -)

...