나는 그런 디렉토리 구조를 가지고 : 심볼릭 링크 라이브러리에 디렉토리와 심볼릭 링크 점에 가리키는 :젠투 LD 라이브러리에 RUNPATH를 생성
$ libtrotl.so -> /usr/local/lib64/tora-3.1/../libtrotl.so
$ instantclient -> /usr/lib/oracle/12.1/client64/lib
나는 도서관 libtrotl.so을한다면 dlopen 때, 모든 종속 라이브러리가 해석되고로드됩니다. 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 링커 (GNU gold (Gentoo 2.25.1 p1.1 2.25.1) 1.11)는 RPATH와 함께 RUNPATH를 추가합니다.
0x000000000000001d (RUNPATH) Library runpath: [$ORIGIN/instantclient/]
그러면 동적 링커에서 라이브러리를 확인하지 못합니다.
두 번째 경우 libmql1.so 라이브러리는 instantclient 하위 디렉토리에 있지만 발견되지 않습니다. Gentoo에서 RPATH를 어떻게 설정할 수 있습니까?