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


70

나는 현재 데비안에 이상한 문제가 있습니다 (wheezy / amd64).

서버를 설치하기 위해 chroot를 만들었습니다 (더 자세한 내용은 알려 드릴 수 없습니다, 죄송합니다). 경로를 호출하자 /chr_path/. 일을 쉽게하기 위해 debootstrap (또한 wheezy / amd64) 으로이 chroot를 초기화했습니다.

모두는 chroot 안에서 잘 작동하는 듯하지만 내가 가진 내 서버의 설치 스크립트를 시작했을 때 : zsh: Not found /some_path/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
"이러한 파일이나 디렉토리가 없음" 과 같은 문제는 Optware가 설치된 바이너리에 있습니다. Perl은 32 비트 실행 파일입니다. 32 비트 런타임 시스템 ( libc6-i386패키지 또는 ia32-libs많은 라이브러리를 원하는 경우)이 없습니다.
Gilles

@ Gilles : 고마워요! 적성 설치 ia32-libs가 문제를 해결했습니다! 나는 perl이 32 비트 인 것을 보았지만 그것이 메인 시스템 (동일 배포)에서 작동하고 있었기 때문에 나는 그것이 링크되어 있지 않다고 가정했다. 실제로, 어느 시점에서 주 시스템에 32 비트 런타임 시스템을 설치해야합니다.
Elenaher

1
@ Gilles : 나는 이것을 중복 질문으로 표시하는 대신 간결한 답변으로 추가 할 것이라고 생각합니다. 환경은 문제가 동일하더라도 사람을 검색하는 것이 서로 충돌 할 가능성이 더 큽니다.
Caleb

1
@Caleb 우리는 그 이유로 정확히 중복을 삭제하지 않습니다. 이 게시물을 찾는 검색자는 다른 게시물의 중복 링크를 따라갑니다. 이것이 같은 문제라면 아마 문을 닫아야합니다
Michael Mrozek

@MichaelMrozek 나는이 질문에 대해 마음을 바꿨습니다. 기본 문제는 동일하지만 구체적인 해결책은 약간 다릅니다 (한 경우 ARM ABI를 혼합하지 않고 다른 경우 amd64 Linux 배포판에서 32 비트 지원 가능) . 그래서 나는이 질문이 결국 열려 있다고 생각합니다.
Gilles

답변:


72

"로더"에 의존하는 파일을 실행하지 못하면, 실행중인 파일이 아니라 로더가 오류가 발생할 수 있습니다.

  • 동적으로 링크 된 기본 실행 파일의 로더는 동적 라이브러리로드를 담당하는 시스템의 일부입니다. 이 같은 뭔가 /lib/ld.so/lib/ld-linux.so.2, 그리고 실행 파일이어야합니다.
  • 스크립트 로더는 shebang 행에 언급 된 프로그램입니다 (예 : /bin/sh로 시작하는 스크립트) #!/bin/sh. (이 경우 Bash와 zsh는 "command not found"대신 "bad 인터프리터"라는 메시지를 표시합니다.)

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

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

이 상황은 올바른 시스템 (또는 시스템 계열) 및 수퍼 아키텍처에 대해 바이너리를 실행하려고하지만 하위 아키텍처를 잘못 실행할 때 종종 발생합니다. 여기에는 ELF 바이너리가 필요한 시스템에 ELF 바이너리가 있으므로 커널이 제대로로드합니다. 그것들은 x86_64 프로세서에서 실행되는 i386 바이너리이므로 명령어는 의미가 있으며 로더를 찾을 수있는 지점으로 프로그램을 가져옵니다. 그러나 프로그램은 32 비트 프로그램 ( file출력이 표시하는 것처럼 )이며 32 비트 로더를 찾고 /lib/ld-linux.so.2있으며 아마도 /lib64/ld-linux-x86-64.so.2chroot에 64 비트 로더 만 설치했을 것 입니다.

32 비트 런타임 시스템을 chroot (로더 및 프로그램에 필요한 모든 라이브러리)에 설치해야합니다. 데비안에서 둘 다 I386 및 x86_64의 지원을 원하는 경우 위지 이후, AMD64 설치를 시작하고 활성화 multiarch 지원 : 실행 dpkg --add-architecture i386다음 apt-get updateapt-get install libc6:i386 zlib1g:i386 …당신이 라이브러리에 대한 가능성을 확인하려면 데비안의 펄 패키지의 의존성 목록을 생성하려는 경우 ( aptitude search -F %p '~Rdepends:^perl$ ~ri386') 를 사용할 수 있습니다 . ia32-libs패키지 를 설치하여 공통 라이브러리 모음을 가져올 수 있습니다 (먼저 다중 아키텍처 지원을 활성화해야 함). 데비안 amd64에서 wheezy까지 32 비트 로더가 libc6-i386패키지에 있습니다. 을 설치하여 더 큰 32 비트 라이브러리 세트를 설치할 수 있습니다 ia32-libs.


이것이 오류 메시지를 유발할 수있는 유일한 것입니까? 32 비트 라이브러리가 설치되어 있으며 여기에 출력이ldd 있지만 여전히 동일한 오류가 발생합니다.
Nathan Osman 2016 년


설치를 시도 lsb-core했지만 도움이되지 않는 것 같습니다. 나는 이것에 대한 새로운 질문을 여는 것이 더 좋다고 생각합니다.
Nathan Osman 2016 년

이것에 감사합니다. 방금 이틀간의 머리 긁기를 끝내 셨습니다. 나는 모든 것이 정적으로 컴파일되고 있다고 생각했지만 그렇지 않았습니다!
Finn O'leary

5

바이너리 ldd(1)에서 실행하십시오 perl. Not found프로그램에서 사용하는 공유 라이브러리 중 하나를 찾을 수 없기 때문에 파일에 명백하게 혼동되는 오류가있는 경우가 종종 있습니다.

따라서 바이너리에 필요한 공유 라이브러리와 관련하여 chroot가 불완전 할 수 있습니다.


실제로 나는 perl is not a dynamic executablechroot에있을 때 외부에서 올바른 종속성 목록을 얻습니다. 나는 현재 이상한 것이 있는지 확인하고 있지만 이런 종류의 부족을 피하고 많은 libs를 이미 가지고 있기 위해 debootstrap을 사용했습니다 (chroot 시스템에는 perl 실행 파일이 있지만 실행중인 버전은 다릅니다. symbolic link?)
Elenaher

솔직히 말하면, debootstrap이 완전한 chroot를 생성 할 것으로 기대했을 것이므로 그 점에서 내 대답이 정확하지 않을 것입니다. 그러나 chroot 문제가있는 누락 된 라이브러리를 뛰어 다니기 때문에 내 대답이 날지 않을 것이라고 생각했습니다.
camh

cf. 주요 게시물에 Gilles에게 의견 : 당신이 맞았습니다. 일부 라이브러리가 누락되었습니다. debootstrap의 주요 장점은 기본 적성 설치로 문제를 해결할 수 있다는 것입니다. :)
Elenaher
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.