64비트 시스템에서 32비트 바이너리를 실행할 때 "찾을 수 없음" 메시지 수신

64비트 시스템에서 32비트 바이너리를 실행할 때 "찾을 수 없음" 메시지 수신

현재 데비안(wheezy/amd64)에서 이상한 문제가 발생했습니다.

서버를 설치하기 위해 chroot를 만들었습니다(죄송하지만 자세한 내용은 제공할 수 없습니다). 우리는 그것을 경로라고 부릅니다 /chr_path/. 작업을 더 쉽게 하기 위해 debootstrap(또한 wheezy/amd64)을 사용하여 이 chroot를 초기화했습니다.

chroot 내에서는 모든 것이 잘 돌아가는 것 같지만, 서버의 설치 ​​프로그램 스크립트를 시작하면 다음과 같은 메시지가 나타납니다. ( zsh: Not found /some_path/perl어떤 이유로 설치 프로그램에 perl 바이너리가 포함되어 있는지)

/some_path/당연히 위치를 확인해보니 "perl" 바이너리가 발견되었습니다. filechroot 환경에서 반환:

/some_path/perl ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped

파일이 존재하고 괜찮아 보이며 올바른 권한을 가지고 있습니다. file, 를 사용할 수 ls있지만 vim실행하려고 하면( ./perl예를 들어) 다음과 같은 결과가 나타납니다 zsh: Not found ./perl.

이 상황은 나에게 이해됩니다. 그리고:

  • 오류 없이 chroot에서 다른 기본 바이너리(/bin/ls, ...)를 실행할 수 있습니다.
  • 프로젝트와 함께 제공되는 다른 바이너리에도 동일한 문제가 있습니다.
  • /chr_path/some_path/perl메인 루트()에서 바이너리를 실행 하려고 하면 작동합니다.
  • 바이너리 중 하나를 내 것과 비교해 보았습니다 ls. 액세스 권한이 동일한지 확인했지만 아무 것도 변경되지 않았습니다(하나는 작동하고 다른 하나는 작동하지 않음).

답변1

"로더"에 의존하는 파일을 실행할 수 없는 경우 수신되는 오류는 실행 중인 파일이 아닌 로더와 관련이 있을 수 있습니다.

  • 동적으로 링크된 기본 실행 파일의 로더는 동적 라이브러리 로드를 담당하는 시스템의 일부입니다. 이는 /lib/ld.so또는 실행 파일과 유사 /lib/ld-linux.so.2하며 실행 파일이어야 합니다.
  • /bin/sh스크립트의 로더는 로 시작하는 스크립트 와 같이 shebang 줄에 언급된 프로그램입니다 #!/bin/sh. (이 경우 Bash와 zsh는 "명령을 찾을 수 없음" 대신 "잘못된 해석기"라는 메시지를 표시합니다.)

오류 메시지는 오해의 소지가 있으며 로더에 문제가 있음을 나타내지 않습니다. 불행히도 커널 인터페이스에는 숫자 오류 코드를 보고할 공간만 있고 오류가 실제로 다른 파일과 관련되어 있음을 나타낼 공간이 없기 때문에 이 문제를 해결하는 것은 어렵습니다. 일부 쉘은 스크립트 자체에 대해 이 작업을 수행하지만( #!스크립트의 줄을 읽고 오류 조건을 다시 평가) 네이티브 바이너리에 대해 동일한 작업을 수행하려는 쉘은 본 적이 없습니다.

ldd또한 일부 특별한 환경 변수를 설정한 다음 프로그램을 실행하고 로더가 작업을 수행하도록 함으로써 작동하기 때문에 바이너리에서는 작동하지 않습니다. strace또한 커널이 보고하는 것 이상을 보고하지 않기 때문에 의미 있는 정보도 제공하지 않습니다. 그리고 우리가 본 것처럼 커널은 알고 있는 모든 것을 보고할 수 없습니다.

이는 일반적으로 올바른 시스템(또는 시스템 제품군) 및 슈퍼 아키텍처에 대해 바이너리를 실행하려고 하지만 잘못된 하위 아키텍처에 대해 실행하려고 할 때 발생합니다. 여기에는 이를 필요로 하는 시스템에 ELF 바이너리가 있으므로 커널은 이를 제대로 로드할 수 있습니다. 이는 x86_64 프로세서에서 실행되는 i386 바이너리이므로 이러한 지침은 의미가 있으며 프로그램이 해당 로더를 찾을 수 있도록 합니다. 그러나 이 프로그램은 32비트 프로그램(출력에 표시됨 )으로 32비트 로더를 찾고 있으며 아마도 filechroot에는 /lib/ld-linux.so.264비트 로더만 설치되어 있을 것입니다./lib64/ld-linux-x86-64.so.2

chroot: 로더와 프로그램에 필요한 모든 라이브러리에 32비트 런타임 시스템을 설치해야 합니다. Debian wheezy부터 i386 및 x86_64 지원을 원하면 amd64 설치부터 시작하여 활성화하세요.다중 아키텍처support: run then dpkg --add-architecture i386(어떤 라이브러리가 필요할지 알아보기 위해 데비안 펄 패키지의 종속성 목록을 생성하려는 경우 이것을 사용할 수 있습니다). 다음을 설치하여 공공 도서관 컬렉션을 가져올 수 있습니다.apt-get updateapt-get install libc6:i386 zlib1g:i386 …aptitude search -F %p '~Rdepends:^perl$ ~ri386'ia32-libs패키지(먼저 다중 아키텍처 지원을 활성화해야 함) Debian amd64에서 wheezy까지 32비트 로더가 있습니다.libc6-i386팩. 다음을 설치하여 더 큰 32비트 라이브러리 세트를 설치할 수 있습니다.ia32-libs.

답변2

ldd(1)바이너리에서 실행하세요 perl. Not found분명히 존재하는 파일에 대한 겉보기에 혼란스러운 오류는 프로그램에서 사용하는 공유 라이브러리 중 하나를 찾을 수 없기 때문에 발생하는 경우가 많습니다 .

따라서 바이너리에 필요한 공유 라이브러리에 대해 chroot가 불완전할 수 있습니다.

관련 정보