tar
방금 호출할 수 있는 프로그램을 실행하는 데 필요한 모든 것이 포함된 파일을 다운로드했습니다 some_binary
. 내용을 추출해 보니 다음과 같습니다.
- 바이너리 파일(이라고 부르자
some_binary
) - 다양한 동적 라이브러리(.so 파일)가 포함된 폴더
lib
./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
으로 참조할 수도 있는 빈 문자열 (예: 스크립트가 포함된 디렉터리)로 확장됩니다. 또한 귀하의 질문에 일관되지 않은 콘텐츠를 사용하고 있다는 점에 유의하세요. 노력하다$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" "$@"