ld-linux.so를 사용하여 스크립트를 호출하시겠습니까?

ld-linux.so를 사용하여 스크립트를 호출하시겠습니까?

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

이에 대한 내 질문은 다음과 같습니다.

  1. 첫 번째 스크립트는 무엇을 합니까?
  2. 세 번의 시도에서 왜 다른 결과가 나오나요? 왜 추가 $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")libLIB

#!/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" "$@"

관련 정보