실행 파일의 하드코딩된 동적 링크 수정

실행 파일의 하드코딩된 동적 링크 수정

나는등록하다다음과 같은 공유 라이브러리 종속성이 있습니다.

[terminal]$ ldd ./reg
linux-vdso.so.1 => (0x00007ffc40d90000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003be0c00000)
/usr/dep/packages/opt/intel/mkl/10.0.2.018/lib/em64t/libmkl_intel_lp64.so => not found

바이너리를 실행하면 다음과 같은 결과를 얻습니다.

[terminal]$ ./reg
./reg: error while loading shared libraries: /usr/dep/packages/opt/intel/mkl/10.0.2.018/lib/em64t/libmkl_intel_lp64.so: cannot open shared object file: No such file or directory.

문제는 지정된 디렉터리 경로를 만들고 거기에 라이브러리를 배치할 수 있는 관리 권한이 없다는 것입니다. 그리고 소스코드가 없어서 다시 컴파일할 수도 없지만,libmkl_intel_lp64.so라이브러리는 다른 곳에 저장됩니다. 나는 사용하려고LD_예압환경 변수이지만 여전히 라이브러리가 해당 특정 위치에 있어야 합니다. 이 문제를 해결할 방법이 있나요?

감사합니다!

답변1

나는 당신과 같은 바이너리를 가지고 있지 않지만 몇 가지 테스트를 해본 결과 patchelf여기서는 작동하는 것 같습니다. 및 종속성을 사용하여 hello컴파일된 바이너리가 있습니다.-Wl,-rpath=/home/ja/c/hello-puts/make/liblibtest.so

$ ldd hello
        linux-vdso.so.1 (0x00007ffedb4f0000)
        libtest.so => /home/ja/c/hello-puts/make/lib/libtest.so (0x00007f04a2437000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f04a200f000)
        /lib64/ld-linux-x86-64.so.2 (0x0000564a42e36000)

나는 도망 patchelf친다--make-needed-absolutepatchelfhttps://github.com/dezgeg/patchelf/:

$ patchelf --make-needed-absolute hello
$ ldd hello
        linux-vdso.so.1 (0x00007fff9baa3000)
        /home/ja/c/hello-puts/make/lib/libtest.so (0x00007f81bd0e2000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f81bccba000)
        /lib64/ld-linux-x86-64.so.2 (0x0000556714bb5000)

나는 그것이 당신이 가지고 있는 것 같아요. hello다른 컴퓨터에 복사하고 다음을 수행했습니다 .

$ ldd ./hello
        linux-vdso.so.1 =>  (0x00007fff92e7d000)
        /home/ja/c/hello-puts/make/lib/libtest.so => not found
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff381c9b000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ff382065000)

먼저 필요한 libtest.so종속성을 제거했습니다.

$ patchelf --remove-needed /home/ja/c/hello-puts/make/lib/libtest.so hello
$ ldd hello
        linux-vdso.so.1 =>  (0x00007ffdcedfb000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f60705c5000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f607098f000)

running 을 시도했고 hello시작되었지만 인터프리터가 수행한 지연 바인딩으로 인해 예상되는 출력의 첫 번째 줄만 표시되었습니다.

$ ./hello
hello world
./hello: symbol lookup error: ./hello: undefined symbol: foo

다시 추가 했지만 libtest.so절대 경로는 없습니다.

$ patchelf --add-needed libtest.so hello
$ ldd hello
        linux-vdso.so.1 =>  (0x00007ffda155c000)
        libtest.so => not found
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffbdb8c3000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ffbdbc8d000)

복사 libtest.so하여 $PWD실행할 수 있었습니다 hello.

$ LD_LIBRARY_PATH=. ./hello
hello world
inside foo()

관련 정보