ldd /bin/ls
pthread 라이브러리를 제거한 상태에서 이 작업을 수행한다고 가정해 보겠습니다 . 나는 얻다
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
ldd
bash
Linux에서는 주의하세요. 적어도 이전 시스템에서는 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으로 종료되며 명령줄 스위치나 환경 변수를 통해 변경할 수 없습니다. 소스 코드를 변경해야 합니다.