2017-02-08 26 views
-1

나는 그런 디렉토리 구조를 가지고 : 심볼릭 링크 라이브러리에 디렉토리와 심볼릭 링크 점에 가리키는 :젠투 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를 어떻게 설정할 수 있습니까?

답변

1

DT_RPATH 태그는 더 이상 사용되지 않으며, DT_RUNPATH은 몇 가지 다른 의미가있는 최신 구현입니다. Gentoo 링크 편집기 (ldgold)는 기본적으로 사용되지 않는 태그를 생성하지 않습니다. -Wl,--disable-new-dtags을 전달하여 이러한 기능을 사용 중지 할 수는 있지만 가능하지는 않겠지 만 권장하지는 않습니다.

플러그인을 사용할 때이 두 가지의 차이점을 설명하는 Qt의 오래된 포트가 있습니다 : http://blog.qt.io/blog/2011/10/28/rpath-and-runpath/