링커가 /lib에서 라이브러리를 찾을 수 없습니다.

링커가 /lib에서 라이브러리를 찾을 수 없습니다.

나는 동적으로 연결된 비지박스를 포함하는 initramfs와 Linux 커널을 사용하여 x86_64 대상용 소형 임베디드 시스템을 구축하고 있습니다.

libm.so.6필요한 라이브러리( , libc.so.6) /lib와 링커를 ld-linux-x86-64.so.2설치해 보았습니다 /lib64(비지박스 바이너리가 이 위치에서 요청하기 때문입니다).

lib
├── libc.so.6
└── libm.so.6
lib64
└── ld-linux-x86-64.so.2

그러나 연결에 실패합니다.

/sbin/init: error while loading shared libraries: libm.so.6: cannot open shared object file: No such file or directory

나는 모든 것을 다음으로 옮겨서 작동하게 만들었습니다 /lib64.

lib64
├── ld-linux-x86-64.so.2
├── libc.so.6
└── libm.so.6

/lib또는 및 사이에 심볼릭 링크를 생성하여/lib64

lib
├── ld-linux-x86-64.so.2
├── libc.so.6
└── libm.so.6
lib64 -> lib

하지만 첫 번째 구성이 작동하지 않는 이유를 아직도 이해하지 못합니다. 링커가 에서 라이브러리를 찾을 수 없는 이유는 무엇입니까 /lib?

편집하다:작동하게 하려면 (yaegashi에게 감사드립니다):

  • initramfs 루트 디렉터리를 입력합니다.
  • /etc/ld.so.conf필요한 라이브러리 경로로 파일을 만듭니다.

    echo /lib > etc/ld.so.conf

  • 파일 을 생성하세요 ld.so.cache.

    ldconfig -r .

  • initramfs를 다시 빌드하세요. 마치다

답변1

읽다수동ld.so(동적 링커/로더). 실제 검색 경로는 주로 /etc/ld.so.cache내장된(컴파일에서) 경로 또는 ld.so 바이너리에 의해 결정됩니다. 따라서 플랫폼 구성과 glibc 구축 방법을 확인하세요./etc/ld.so.confldconfig

LD_DEBUG=libs환경 변수에서 바이너리 세트를 실행하여 ld.so의 자세한 활동을 관찰 할 수 있습니다 .

$ LD_DEBUG=libs ls
     17441: find library=libselinux.so.1 [0]; searching
     17441:  search cache=/etc/ld.so.cache
     17441:   trying file=/lib/x86_64-linux-gnu/libselinux.so.1
     17441: 
     17441: find library=libacl.so.1 [0]; searching
     17441:  search cache=/etc/ld.so.cache
     17441:   trying file=/lib/x86_64-linux-gnu/libacl.so.1
     17441: 
     17441: find library=libc.so.6 [0]; searching
     17441:  search cache=/etc/ld.so.cache
     17441:   trying file=/lib/x86_64-linux-gnu/libc.so.6
     ...

답변2

빠른 수정으로 .bashrc 를 통해 lib쉘 환경 변수에 추가하세요.LD_LIBRARY_PATH

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib

그런 다음,

source /home/user/.bashrc

관련 정보