bash : ./program : 이진 파일을 실행할 수 없습니다 : Exec 형식 오류


92

프로그램을 실행하려고하는데 다음과 같은 오류가 발생합니다.

bash: ./program: cannot execute binary file: Exec format error

결과 file program는 다음과 같습니다.

program: ELF-32-bit LSB executable, ARM, EABI4 version 1 (SYSV), dynamically linked(uses share libs), for GNU/LINUX 2.6.16, not stripped

이 오류를 어떻게 해결할 수 있습니까?

VMware에서 Ubuntu 14.04.2 (amd64)를 사용하고 있습니다. 나는 또한 Ubuntu i386으로 시도했지만 결과는 동일했습니다.


4
ARM 실행 파일입니다. 즉, 잘못된 실행 파일 형식을 다운로드했거나 잘못된 플랫폼 용으로 컴파일했습니다. 올바른 실행 파일을 얻거나 다시 컴파일해야합니다.
Karl Richter

답변:


77

x86-64 아키텍처에서 ARM 아키텍처 용으로 컴파일 된 실행 파일을 실행하려고합니다. 이는 영어를 구사하는 프로세서에게 중국어로 지시하도록 요청하는 것과 매우 유사합니다.

해당 실행 파일을 실행해야하는 경우 다음 두 가지 중에서 선택할 수 있습니다.

  1. x86-64 버전의 실행 파일 가져 오기 );

  2. Ubuntu 14.04.2 (amd64) 대신 ARM 용 Ubuntu Server를 설치하십시오 . 이를 위해서는 ARM 아키텍처에서 실행되는 실제 머신 또는이를 에뮬레이트 할 수있는 가상화 소프트웨어가 필요합니다.


23

32 비트 플랫폼에서 x86-64 실행 파일을 실행하려는 경우에도 발생할 수 있습니다.

특정 인스턴스에서 Visual Studio Code를 다운로드하여 Ubuntu 설치에서 실행하려고 시도했지만이 VM에 32 비트 Ubuntu가 설치되어 있다는 것을 알지 못했습니다. 이 오류가 발생했지만 32 비트 버전을 다운로드 한 후 문제없이 실행되었습니다.


8

binfmt-supportbinfmt-support 설치 , qemuqemu 설치qemu-user-staticqemu-user-static 설치 패키지 를 설치하면 amd64 시스템에서 ARM 실행 가능 이미지를 실행할 수있는 경우가 종종 있습니다 .

sudo apt install binfmt-support qemu qemu-user-static

qemu그런 다음 실행 파일을 실행할 때 syscall 에뮬레이션을 수행합니다. 이것은 대부분의 ARM 바이너리에서 작동하지만 올바르게 실행되지 않을 수도 있습니다.


sudo apt-get install binfmt-support qemu qemu-user-static
Momin Al Aziz

7

다음 모두에 해당하면 이러한 오류가 발생할 수 있습니다.

  • 실행 파일은 파일이 아니라 링크입니다
  • VM 내에서 실행
  • 파일이 공유 폴더에 있습니다
  • 호스트는 Windows입니다.

해당 파일이있는 경우 아카이브에서 예를 들어 호스트 시스템 하드 드라이브에 매핑 된 폴더가 아닌 가상 드라이브 내부의 일부 디렉토리에서 VM 내에서 압축을 풉니 다. /myNewDir/


꽤 도움이됩니다. 나에게 그 실행 파일에 대한 바로 가기 (링크)를 만든 다음 바로 가기를 실행하면 오류가 발생했습니다.
Duc Tran

2

적절한 CPU 아키텍처 (예 : x86)를 사용하여 파일을 컴파일하고 Linux 시스템에서 .exe 파일을 복사해야합니다. 그런 다음 Linux 시스템에 mono를 설치하고 다음 명령을 발행 할 수 있습니다.

mono myprogram.exe

2

java시스템에 둘 이상 이 설치되어 있으면 이것이 발생하고 기본값으로 설정되지 않을 수 있습니다. Ubuntu14.04 LTS에서 다음을 실행하고 java필요한 것을 선택하여 해결할 수 있습니다 .

sudo update-alternatives --config java
[sudo] password for user: 
update-alternatives: warning: /etc/alternatives/java has been changed (manually or by a script); switching to manual updates only
There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      auto mode
  1            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      manual mode
  2            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1069      manual mode

Press enter to keep the current choice[*], or type selection number: 2
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java to provide /usr/bin/java (java) in manual mode

2를 선택 openjdk-8하고 기본값으로 설정합니다. 어느을 표시하지 않았습니다 Exec format error.


0

바이너리가 musl과 같은 libc가 아닌 libc 구현을 사용하는 경우에도 발생할 수 있습니다. 요즘이 특정 문제는 고산 기반 이미지가있는 Docker 컨테이너에서 libc로 바이너리를 실행하려고 할 때 발생합니다. libc 구현은 항상 정적으로 링크되어 있어야합니다 (즉, 바이너리에 직접 빌드되어야하기 때문에).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.