
tar
방금 호출할 수 있는 프로그램을 실행하는 데 필요한 모든 것이 포함된 파일을 다운로드했습니다 some_binary
. 내용을 추출했는데 다음과 같습니다.
- 바이너리(라고 부르자
some_binary
) lib
다음과 같은 다양한 동적 라이브러리(.so 파일)가 있는 폴더/lib/ld-linux-x86-64.so
- 그리고 다음과 같은 쉘 스크립트가 있습니다.
some_binary.sh
스크립트의 내용은 다음과 같습니다.
#!/bin/bash
`dirname "$0"`/lib/ld-linux-x86-64.so.2 `dirname "$0"`/some_binary "$@"
올바르게 실행 ./some_binary.sh some arguments
되는 것 같습니다 ./some_binary
. 이상하게도 다음 스크립트를 실행합니다.
#!/bin/bash
LD_LIBRARY_PATH=$CWD/LIB:$LD_LIBRARY_PATH
./some_binary "$@"
작동하지 않습니다 ./my_script.sh some arguments
. 재배치 오류(정의되지 않은 기호)가 발생합니다. 아마도 아래의 라이브러리를 잘못 로드했기 때문일 것입니다../lib
또한 명령줄에서 다음 두 문을 실행하면 다음과 같은 결과가 나타납니다 segmentation fault
.
> LD_LIBRARY_PATH=$CWD/LIB:$LD_LIBRARY_PATH
> ./some_binary some arguments
이에 대한 내 질문은 다음과 같습니다.
- 첫 번째 스크립트는 무엇을 합니까?
- 세 가지 시도에서 서로 다른 결과를 얻는 이유는 무엇입니까? 왜 그냥 추가
$pwd/lib
하고LD_LIBRARY_PATH
직접 실행할some_binary
수 없나요?
답변1
이 프로그램은 자체적으로 제공됩니다.동적 로더. 프로그램이 자체 동적 로더를 필요로 하는 경우는 매우 드뭅니다. 일반적으로 시스템에 있는 동적 로더도 작동합니다. 이는 프로그램이 GNU libc가 아닌 표준 라이브러리에 링크되었거나 이상한 설정으로 컴파일된 GNU libc에 링크된 경우 필요할 수 있습니다.
프로그램이 선호하는 라이브러리를 찾을 위치를 로더에게 알려주는 것만으로도 충분할 수 있습니다. 귀하의 시도는 거의 그렇게 되지만, 꼭 그런 것은 아닙니다. LD_LIBRARY_PATH
환경에 아직 없는 경우 할당은 환경 LD_LIBRARY_PATH=$CWD/LIB:$LD_LIBRARY_PATH
변수가 아닌 셸 변수만 정의하므로 프로그램에서는 아무 것도 볼 수 없습니다. 또한 일반적 으로 $CWD
빈 문자열 (예: 스크립트가 포함된 디렉터리)로 확장됩니다. 또한 귀하의 질문에 and 을(를 ) 사용했다는 점에 유의하세요. 노력하다$PWD
$(dirname "$0")
lib
LIB
#!/bin/sh
export LD_LIBRARY_PATH="$(dirname "$0")/lib:$LD_LIBRARY_PATH"
exec "$(dirname "$0")/some_binary" "$@"
또는 이전에 정의되지 않은 경우 끝에 빈 항목이 생기지 않도록 하는 것이 더 좋습니다 LD_LIBRARY_PATH
(빈 항목은 현재 디렉토리를 나타내기 때문에 나쁠 수 있지만 경로 끝에서는 라이브러리가 정의되지 않은 경우에만 해로울 수 있습니다). 있어야 할 위치를 찾을 수 없습니다):
#!/bin/sh
export LD_LIBRARY_PATH="$(dirname "$0")/lib:$LD_LIBRARY_PATH"
case "$LD_LIBRARY_PATH" in *:) LD_LIBRARY_PATH=${LD_LIBRARY_PATH%:};; esac
exec "$(dirname "$0")/some_binary" "$@"