ldd가 표시하는 공유 라이브러리의 경로를 변경하는 방법은 무엇입니까?

ldd가 표시하는 공유 라이브러리의 경로를 변경하는 방법은 무엇입니까?

내 시스템에서 Postgis 확장 기능을 작동시키려고 하는데 항상 "$libdir/postgis2.2" no such file or Directory 오류가 발생합니다. 호기심에 "ldd postgis-2.2.so"를 실행했더니 다음과 같이 출력되었습니다.

    linux-vdso.so.1 =>  (0x00007ffff3bc8000)
    /usr/lib64/libjemalloc.so.1 (0x00002b3fe5ff4000)
    libgeos_c.so.1 => not found
    libproj.so.9 => not found
    libjson-c.so.2 => not found
    libxml2.so.2 => /usr/lib64/libxml2.so.2 (0x00002b3fe6237000)
    libm.so.6 => /lib64/libm.so.6 (0x00002b3fe659e000)
    libc.so.6 => /lib64/libc.so.6 (0x00002b3fe689c000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b3fe6c41000)
    /lib64/ld-linux-x86-64.so.2 (0x00002b3fe5b2e000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00002b3fe6e5d000)
    libz.so.1 => /lib64/libz.so.1 (0x00002b3fe7061000)
    liblzma.so.5 => /usr/lib64/liblzma.so.5 (0x00002b3fe7277000)

많은 종속성의 경우 해당 경로가 존재하지 않는 것으로 나타났습니다. 나는 이것이 Postgis를 구축하지 않고 수동으로 작동하도록 필요한 라이브러리와 라이브러리를 복사했기 때문이라고 생각합니다. 하지만 나는 Postgis에 필요한 so 파일의 경로를 알고 있습니다. 종속성에서 "찾을 수 없음"을 Postgis에서 요구하는 경로로 변경하려면 어떻게 해야 합니까?

답변1

많은 튜토리얼에서 이미 이 내용을 부분적으로 다루었지만 많은 솔루션에 기본 예제가 누락된 것 같습니다.

  • 리눅스의 경우,patchelf이 작업은 Linux에서 수행할 수 있습니다.
  • MacOS에는 다음과 같은 프로그램이 있습니다.install_name_tool.

Linux를 사용한다고 가정합니다.

노트: patchelf많은 시스템에는 기본적으로 설치되지 않습니다. apt install patchelf또는 패키지 관리자가 제공하는 것을 dnf install patchelf사용 하여 설치할 수 있습니다 .pacman install patchelf

patchelf --print-needed mysharedobject.so

# outputs:
../libsomething1.so
libsomething2.so.1

필요한 라이브러리의 경로를 바꿉니다.

patchelf --replace-needed ../libsomething1.so /foo/bar/libsomething1.so mysharedobject.so

새 경로를 테스트합니다.

patchelf --print-needed mysharedobject.so

# outputs:
/foo/bar/libsomething1.so 
libsomething2.so.1

노트:많은 튜토리얼에서는 다음과 같은 다른 도구를 권장합니다.chrpath.so이는 속성이 설정된 파일 에 도움이 되지만 rpathrpath가 없는 라이브러리에서는 작동하지 않는 것 같으며 절대 링크 위치를 변경할 수도 없습니다.

답변2

ld.so동적 링커는 PATH실행 시 연결할 공유 라이브러리를 검색할 때 -like 환경 변수를 사용합니다.LD_LIBRARY_PATH

링커가 라이브러리를 찾아야 하는 디렉터리의 --separated 목록을 설정할 수 있습니다 LD_LIBRARY_PATH. 예를 들면 다음과 같습니다.:

$ env LD_LIBRARY_PATH="$HOME/local/lib:/opt/other/lib" ./myprog

자세한 내용은 ld.so시스템 설명서를 참조하십시오.

관련 정보