라이브러리를 찾을 수 없으면 ldd에 해당하는 작업이 실패합니다.

라이브러리를 찾을 수 없으면 ldd에 해당하는 작업이 실패합니다.

ldd /bin/lspthread 라이브러리를 제거한 상태에서 이 작업을 수행한다고 가정해 보겠습니다 . 나는 얻다

linux-vdso.so.1 (0x00007ffcc3563000)

libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f87e5459000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007f87e5254000)
libc.so.6 => /lib64/libc.so.6 (0x00007f87e4e92000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f87e4c22000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f87e4a1e000)
/lib64/ld-linux-x86-64.so.2 (0x00005574bf12e000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007f87e4817000)
libpthread.so.0 => not found

반환 코드는 0입니다. 이 경우 오류를 반환하는 명령이 있습니까? 비슷한 것

#!/bin/bash
if [[ ! -z $(ldd ${target} | grep 'not found') ]]; then
   exit 1
fi

답변1

lddbashLinux에서는 주의하세요. 적어도 이전 시스템에서는 LD_TRACE_LOADED_OBJECTS=1해당 환경에서 특정 프로그램을 실행 하는 스크립트 일 뿐입니다 .

즉, 프로그램에 로 실행 중인 인터프리터가 아닌 다른 인터프리터가 있는 경우 /lib{64,32}/ld-*프로그램은 의도하지 않았더라도 대상을 첫 번째 인수로 사용하여 실행됩니다. ldd다른 사용자가 소유한 실행 파일에서 실행 하면 해당 사용자는대신에.

를 사용하여 ELF 헤더에 정의된 인터프리터를 확인할 수 있습니다 readelf -l "$target" | grep interpreter.

최신 시스템에서는 ldd"좋은" 인터프리터 목록에서 가져온 인터프리터에 대상을 매개변수로 전달하도록 변경되었습니다(예: /lib64/ld-linux.so.2 target). 이것이 설득력이 있다고 생각하지는 않지만 충분히 안전한지는 사용자에게 달려 있습니다. 결정하다.

이러한 사항이 모두 수용 가능한 경우 가장 쉬운 방법은 다음과 같습니다.

if ldd "$target" | grep -q 'not found'; then
   echo >&2 "$target is missing dependencies"
   exit 1
fi

Linux의 기본 동적 로더는 "추적 모드"(예: ldd에서)로 호출되면 항상 상태 0으로 종료되며 명령줄 스위치나 환경 변수를 통해 변경할 수 없습니다. 소스 코드를 변경해야 합니다.

관련 정보