Linux exe cannot execute binary file

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

How can I fix this? I’m using Ubuntu 14.04.2 (amd64) with VMware. I also tried using Ubuntu i386, but the result was the same.

It’s an ARM executable, i.e. you downloaded the wrong executable format or compiled for the wrong platform. You have to get the right executable or recompile.

9 Answers 9

You’re trying to run an executable compiled for an ARM architecture on an x86-64 architecture, which is much like asking your processor who only speaks English to take directions in Chinese.

If you need to run that executable you have two choices:

  1. Get an x86-64 version of the executable (by any mean; if you’re unable to get an x86-64 version of the executable but you’re able to get its source code, you can try to recompile it on the virtual machine);
  2. Install Ubuntu Server for ARM in place of Ubuntu 14.04.2 (amd64). This requires either a physical machine running on an ARM architecture or a virtualization software that can emulate it.

While the answer seems to be full-fledge, I tried to speak to my processor in English, but it arrogantly ignores me and doesn’t reply anything 🙁

This can also occur if you attempt to run an x86-64 executable on a 32-bit platform.

In one specific instance, I downloaded Visual Studio Code and tried to run it on my Ubuntu installation, but I hadn’t realized that I had installed 32-bit Ubuntu in this VM. I got this error, but after downloading the 32-bit version, it ran without issue.

It is often possible to run an ARM executable image on an amd64 system if you install the binfmt-support , qemu , and qemu-user-static packages:

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

qemu will then perform syscall emulation when you run the executable. This works for most ARM binaries but there are a few that may not run correctly.

After install, was able to execute with /usr/bin/arm-linux-gnueabi-gcc -mfpu=neon -mcpu=cortex-a9 -mfloat-abi=softfp main.c -static

Such error may occur if all of the following are true:

  • Executable is not a file but a link
  • You run run it inside VM
  • File is located in shared folder
  • Your host is Windows.

If you got that file, let’s say, in archive — try to unpack it inside VM, in some directory inside virtual drive, not folder mapped to your host machine hard drive, for example /myNewDir/

Читайте также:  What is linux devops

That’s pretty helpful. For me, I created a shortcut (link) to that executable file, then executing the shortcut gave me the error.

If more than one java is installed on the system this might happen and not set as default. On Ubuntu14.04 LTS I could get it resolved by executing following and choosing the java I needed.

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 

I choose 2 and set openjdk-8 as a default. Which did not show the Exec format error .

Источник

Решение проблемы с ошибкой «bash: не удаётся запустить бинарный файл: Ошибка формата выполняемого файла»

В операционной системе Linux при запуске скаченного файла, либо при запуске самостоятельно скомпилированного файла вы можете столкнуться с ошибкой:

bash: /путь/до/файла: не удаётся запустить бинарный файл: Ошибка формата выполняемого файла

Если у вас англоязычная локаль, то ошибка будет примерно такой:

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

В самой ошибке вместо /путь/до/файла и ./program будет указан путь до файла программы, который вы хотите запустить.

Причинами данной ошибки могут быть:

  • попытка запустить 64-битный файл на 32-битной системе
  • файл скомпилирован для другой архитектуры (например, для ARM, а вы пытаетесь запустить его на ПК)
  • вы пытаетесь выполнить не исполнимый файл, а ссылку
  • файл размещён в совместной (shared) папке

Чтобы получить информацию о файле, который вы пытаетесь запустить, можно использовать утилиту file, после которой укажите путь до файла:

program: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=03ada11d91d298913990bfc074ccc3a380d26b69, with debug_info, not stripped

Здесь мы видим, что файл предназначен для 64-битной системы, об этом говорит запись 64-bit, для процессора с архитектурой x86-64.

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

Этот файл для 32-битных систем, для процессора с архитектурой ARM EABI4.

Если вы не знаете, какой битности ваша система, то выполните команду:

Для 64-битных систем будет выведено x86_64, а для 32-битных – x86.

О разрядности дистрибутивов Linux и о программ

На компьютер с 32-битным процессором вы можете установить только 32-битную операционную систему и в ней запускать только 32-битные программы.

На компьютер с 64-битным процессором вы можете установить как 64-битную ОС, так и 32-битный Linux. В случае, если вы установили 64-битный дистрибутив Linux, то в нём вы можете запускать и 64-битные программы и 32-битные. А если вы установили 32-битный дистрибутив, то в нём возможно запускать только 32-битные программы.

Читайте также:  New terminal windows linux

Итак, если у вас 32-битная система, а файл для 64-битной системы или даже для ARM архитектуры, то у вас следующие варианты:

  • скачать файл подходящей для вас битности и архитектуры
  • если вы самостоятельно компилировали файл из исходного кода, то заново скомпилируйте для процессора вашей архитектуры

Запуск ARM файлов в Linux

Часто можно запустить исполнимые образы ARM на amd64 системах если установить пакеты binfmt-support, qemu, и qemu-user-static:

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

Заключение

Итак, ошибка формата выполняемого файла с невозможностью запустить бинарный файл возникает из-за несоответствия программы операционной системе или архитектуре процессора. Эта проблема не должна возникать, если вы установили программу из исходных репозиториев (кроме случаев неправильной настройки источников репозитория). При возникновении этой проблемы поищите файл, подходящий для вашей архитектуры или скомпилируйте файл из исходных кодов под архитектуру вашей операционной системы.

Связанные статьи:

Источник

linux ‘cannot execute binary file’ on every executable I compile, chmod 777 doesn’t help

I am running red had linux 7.3 (old, I know), and for the past few months I’ve been learning assembly programming, writing small programs and compiling with nasm. For months, things have been going fine, and now for some unknown reason, I cannot execute any programs that I compile.

nasm file.s //used to work just fine, then I'd execute ./file 

now, when I run ./file, first I get «permission denied», which never used to happen before. then, once i chmod +777 file, I get «cannot execute binary file». I have NO IDEA why this is happening, but it is extremely frustrating since NOTHING I compile will run anymore. Logging in as root doesn’t change anything. All suggestions are welcome, THANK YOU!!

Please post output from ls -l after you compiled the file. The «cannot execute» error might be just caused by an incorrectly generated binary (not linked, wrong architecture, whatever. ).

6 Answers 6

nasm does not produce an executable, but just an object file (like gcc -c would). You still need to run the linker on it.

N.B.: “0777 is almost always wrong.”

Run the file command on your binaries and make sure they’re identified correctly as executables.

Also try the ldd command. It will very likely fail for the exact same reason, but it’s worth a shot.

This can happen if the file system you operate on is mounted with the noexec option. You could check that by doing mount | grep noexec and see if your current working directory suffers from that.

Читайте также:  Значение операционной системы linux

If this were the problem, the error message would have been «Permission denied», not «Cannot execute binary file».

«Cannot execute binary file» is the strerror(3) message for the error code ENOEXEC . That has a very specific meaning: (quoting the manpage for execve(2) )

[ENOEXEC] The new process file has the appropriate access permission, but has an unrecognized format (e.g., an invalid magic number in its header). 

So what that means is, your nasm invocation is not producing an executable, but rather something else. As John Kugelman suggests, the file command will tell you what it is (user502515 is very likely to be right that it’s an unlinked object file, but I have never used nasm myself so I don’t know).

BTW, you’ll do yourself a favor if you learn GAS/»AT&T» assembly syntax now, rather than when you need to rewrite your assembly code for an architecture that doesn’t do Intel bizarro-world syntax. And I do hope you’re using assembly only for inner-loop subroutines that actually need to be hand-optimized.

Источник

cannot execute binary file

I have a binary executable that’s a part of an academic software package I’ve downloaded. I can’t seem to get it to run, and I don’t have access to the source code. I’ve tried the following things. Any thoughts? Many thanks.

$ chmod +x random_cell $ ./random_cell -bash: ./random_cell: cannot execute binary file $ file random_cell random_cell: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.4, not stripped $ ldd random_cell random_cell: is not an object file $ uname -m x86_64 

2 Answers 2

I ran into the same problem and this is the answer I came up with

$ ~/opt/Linux-3.11.0-i686/svn/bin/svn --version -bash: /home/fennellb/opt/Linux-3.11.0-i686/svn/bin/svn: cannot execute binary file $ file ~/opt/Linux-3.11.0-i686/svn/bin/svn /home/fennellb/opt/Linux-3.11.0-i686/svn/bin/svn: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, BuildID[sha1]=0x6b38ac5ac15af4334712b9bacc6646cabaefde9a, not stripped $ find /bin /usr/bin -maxdepth 1 -type f -print0 | xargs -0 file | awk 'BEGIN /ELF 64-bit/ /ELF 32-bit/ END ' ELF 32-bit count 1639 ELF 64-bit count 0 

Possible solutions: check to see if your CPU supports 64-bit Linux:

$ cat /proc/cpuinfo | egrep '^(model name|cpu MH|vend)' cpu MHz : 1200.000 model name : Intel(R) Pentium(R) Dual CPU E2140 @ 1.60GHz vendor_id : GenuineIntel 

(then Google the exact CPU name to find its specifications)

Then upgrade to a 64-bit Linux (if you can) — Download Ubuntu Desktop

One Alternative to run 64-bit code on 32-bit Linux is to use an true cpu emulator like qemu/bochs — Bochs — OSDev Wiki — with a 64-bit Linux image (or VM like xen if your CPU supports it).

Another is to ask your software provider to recompile for 32-bit.

(For me I am going to recompile from source.)

Источник

Оцените статью
Adblock
detector