2017-02-08 7 views
-1

У меня есть такая структура каталогов: символьная ссылка указывает на директорию и точку SymLink в библиотеку:Gentoo Л.Д. генерирует RUNPATH в библиотеке, когда -Wl, используется -rpath

$ libtrotl.so -> /usr/local/lib64/tora-3.1/../libtrotl.so 
$ instantclient -> /usr/lib/oracle/12.1/client64/lib 

Когда я dlopen библиотека libtrotl.so, все зависимые библиотеки разрешены и загружены. Благодаря RPATH.

$ readelf -d libtrotl.so 

Dynamic section at offset 0x17e7a8 contains 31 entries: 
    Tag  Type       Name/Value 
0x0000000000000001 (NEEDED)    Shared library: [libclntsh.so.12.1] 
0x0000000000000001 (NEEDED)    Shared library: [libboost_system.so.1.60.0] 
0x0000000000000001 (NEEDED)    Shared library: [libstdc++.so.6] 
0x0000000000000001 (NEEDED)    Shared library: [libm.so.6] 
0x0000000000000001 (NEEDED)    Shared library: [libgcc_s.so.1] 
0x0000000000000001 (NEEDED)    Shared library: [libc.so.6] 
0x000000000000000e (SONAME)    Library soname: [libtrotl.so] 
0x000000000000000f (RPATH)    Library rpath: [$ORIGIN/instantclient/] 
0x000000000000000c (INIT)    0xe7898 

$ ldd libtrotl.so 
    linux-vdso.so.1 (0x00007ffdc25d1000) 
    libclntsh.so.12.1 => /home/ivan/.TOra3/poracle/./instantclient/libclntsh.so.12.1 (0x00007f6cd0c37000) 
    libboost_system.so.1.60.0 => /lib64/libboost_system.so.1.60.0 (0x00007f6cd0a24000) 
    libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f6cd069c000) 
    libm.so.6 => /lib64/libm.so.6 (0x00007f6cd0393000) 
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f6cd017b000) 
    libc.so.6 => /lib64/libc.so.6 (0x00007f6ccfdb9000) 
    libmql1.so => /home/ivan/.TOra3/poracle/./instantclient/libmql1.so (0x00007f6ccfb43000) 
    libipc1.so => /home/ivan/.TOra3/poracle/./instantclient/libipc1.so (0x00007f6ccf7c4000) 
    libnnz12.so => /home/ivan/.TOra3/poracle/./instantclient/libnnz12.so (0x00007f6ccf0ba000) 

Я просто использовать -Wl,-rpath,"\$ORIGIN/instantclient/" флаг как компиляции и она работает везде - за исключением Gentoo.

Gentoo linker (GNU gold (Gentoo 2.25.1 p1.1 2.25.1) 1.11) добавляет RUNPATH внутри RPATH.

0x000000000000001d (RUNPATH)   Library runpath: [$ORIGIN/instantclient/] 

Тогда динамический компоновщик не разрешает библиотеки.

(Gentoo)$ ldd libtrotl.so 
    linux-vdso.so.1 (0x00007ffe5c3e9000) 
    libclntsh.so.12.1 => /home/ivan/.TOra3/poracle/./instantclient/libclntsh.so.12.1 (0x00007f245dc9e000) 
    libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.9.4/libstdc++.so.6 (0x00007f245d933000) 
    libm.so.6 => /lib64/libm.so.6 (0x00007f245d62e000) 
    libgcc_s.so.1 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.9.4/libgcc_s.so.1 (0x00007f245d417000) 
    libc.so.6 => /lib64/libc.so.6 (0x00007f245d07d000) 
    libmql1.so => not found 
    libipc1.so => not found 
    libnnz12.so => not found 
    libons.so => not found 

Как вы можете видеть, во втором случае библиотеки libmql1.so не найден, хотя он присутствует в instantclient подкаталоге. Как установить RPATH на Gentoo?

ответ

1

DT_RPATH теги устарели, DT_RUNPATH - это современная реализация с использованием пары различных семантик. Редакторы ссылок Gentoo (как ld, так и gold) не будут генерировать устаревшие теги по умолчанию. Вы можете (но, вероятно, не должны) отключить их, пройдя -Wl,--disable-new-dtags, но это не рекомендуется, как я уже сказал.

Существует более старый банк из Qt, который объясняет разницу этих двух при использовании плагинов: http://blog.qt.io/blog/2011/10/28/rpath-and-runpath/

Смежные вопросы