Предупреждение execve ошибка формата выполняемого файла

Содержание

  1. Решение проблемы с ошибкой «bash: не удаётся запустить бинарный файл: Ошибка формата выполняемого файла»
  2. О разрядности дистрибутивов Linux и о программ
  3. Запуск ARM файлов в Linux
  4. Заключение
  5. execvp: Ошибка формата выполняемого файла
  6. 🛠️ Исправление ошибки «Exec format» при запуске скриптов командой run-parts
  7. Решение ошибки «Exec format» при запуске скриптов командой run-parts
  8. Решение проблемы с ошибкой «bash: не удаётся запустить бинарный файл: Ошибка формата выполняемого файла»
  9. О разрядности дистрибутивов Linux и о программ
  10. Запуск ARM файлов в Linux
  11. Заключение

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

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

pic1 1

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

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

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

Источник

execvp: Ошибка формата выполняемого файла

6bd5d3aff40a91572e2a4c288d18bc68

5917708e051733485f8457dac11fbc5b

074fb2e9776312436cca9ba3c90be35e

3) (Запускается только до перезагрузки ПК и только через root)

QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to ‘/tmp/runtime-root’

void Autorization::listen() *2 62000

bool Setting::connectDatabase() QThread(0x5617d599a3a0)

void SqlWorker::connectToDatabase(QString) «/root/.joxi/setting»

После каждой перезагрузки ПК, Joxi перестаёт запускаться и заново надо его переустанавливать.

Скрипт joxi.sh выдаёт ошибку «execvp: Ошибка формата выполняемого файла«.

[sudo] пароль для alexandr:

Creating directory joxi

Verifying archive integrity. 100% MD5 checksums are OK. All good.

-rwx—— 1 alexandr alexandr 351 июн 5 22:32 install.sh

-rwx—— 1 alexandr alexandr 4305176 июн 5 22:32 joxi

-rwx—— 1 alexandr alexandr 86 июн 5 22:32 joxi.desktop

-rwx—— 1 alexandr alexandr 50 июн 5 22:32 joxi.sh

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl, xcb.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl, xcb.

Operating System: KDE neon 5.18
KDE Plasma Version: 5.18.5
KDE Frameworks Version: 5.70.0
Qt Version: 5.14.2
Kernel Version: 5.3.0-53-generic
OS Type: 64-bit

Источник

🛠️ Исправление ошибки «Exec format» при запуске скриптов командой run-parts

Решение ошибки «Exec format» при запуске скриптов командой run-parts

Чтобы запустить все скрипты в папке «Documents», я запустил:

Я получил следующее сообщение об ошибке:

Bourne shell, или совместимый шеллl:

Bash:

Perl:

Python 2.x:

Python 3.x:

Это то, что мы называем шебанг.

Теперь вернемся к теме.

Отредактируйте ваши скрипты, используя ваш любимый редактор:

Добавьте шебанг в начале скрипта:

Теперь вы можете без проблем запускать скрипты с помощью команды run-parts, используя команду run-parts.

Вы также можете использовать утилиту ShellCheck для поиска проблем в своих скриптах оболочки.

itsec

Telegram 1 1

vkcuttingswordpress

facebooktwitterredditpinterestlinkedinmail

Anything in here will be replaced on browsers that support the canvas element

Источник

Я пытаюсь запустить программу, но ошибка происходит так:

Результатом file program было:

Как я могу исправить эту ошибку?

Я использую Ubuntu 14.04.2 (amd64) с VMware. Я тоже пробовал с Ubuntu i386, но результат был таким же.

Вы пытаетесь запустить исполняемый файл, скомпилированный для архитектуры ARM на архитектуре x86-64, что очень похоже на запрос вашего процессора, который говорит только по-английски, указывать направление на китайском.

Если вам нужно запустить этот исполняемый файл, у вас есть два варианта:

Получить версию исполняемого файла x86-64 (любым способом; если вам не удается получить версию исполняемого файла x86-64, но вы можете получить его исходный код, вы можете попытаться перекомпилировать его на виртуальной машине );

Установите Ubuntu Server for ARM вместо Ubuntu 14.04.2 (amd64). Для этого требуется либо физическая машина, работающая на архитектуре ARM, либо программное обеспечение для виртуализации, которое может эмулировать ее.

Это также может произойти, если вы попытаетесь запустить исполняемый файл x86-64 на 32-разрядной платформе.

В одном конкретном случае я скачал код Visual Studio и попытался запустить его на своей установке Ubuntu, но я не понял, что я установил 32-битную Ubuntu в эту виртуальную машину. Я получил эту ошибку, но после загрузки 32-разрядной версии, он работал без проблем.

qemu затем выполнит эмуляцию syscall при запуске исполняемого файла. Это работает для большинства двоичных файлов ARM, но есть некоторые, которые могут работать неправильно.

Такая ошибка может возникнуть, если выполняются все следующие условия:

Если java в системе установлено более одного, это может произойти и не будет установлено по умолчанию. На Ubuntu14.04 LTS я мог решить ее, выполнив следующее и выбрав java нужное.

Это также может произойти, если двоичный файл использует реализацию libc, которая не является libc, например, musl. В эти дни эта конкретная проблема, скорее всего, встречается при попытке запуска двоичного файла с libc в контейнере Docker с изображением, основанным на alpine. Ничто не может быть сделано с самим двоичным файлом для поддержки обеих сред, потому что реализация libc всегда должна быть статически связана, то есть встроена непосредственно в двоичный файл, по причинам.

Источник

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

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

pic1 1

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

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

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

Источник

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


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

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

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

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

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

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

 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.

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


uname -m

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

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

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

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

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

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

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

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

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

Заключение

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

Понравиласть статья? Жми лайк или расскажи своим друзьям!

Похожие новости:

Linux (видео уроки) Обзор Linux видео уроки 1. Введение в ОС Linux/Unix Ubuntu. Видео linux уроки 2017 года. gnu linux operating system. Linux администрирование и linux уроки, linux скачать. To linux distros for 2017 and обзор linux mint 18 1.

Linux mint 19.1 (скачать) Развиваемый сообществом дистрибутив Linux mint, основанный на Ubuntu и Debian, который ставит целью предоставить пользователю «современную, элегантную и удобную операционную систему, которая одновременно является мощной и

Стала доступна для скачивания финальная версия Linux Mint 19 сразу со всеми основными вариантами рабочих столов: Cinnamon, MATE и Xfce. Если вы только начинаете знакомиться с удивительным миром Linux, то поясню: Cinnamon – это самый передовой и

Rosa Linux — Linux из России. ROSA Fresh. Сделана для дома. Создана для вас. ROSA Fresh — это современная отечественная операционная система Linux, создаваемая сообществом и легально доступная всем желающим совершенно бесплатно и без регистрации.

Иногда программа не запускается из-за отсутствия библиотеки определённой версии, при этом в системе может присутствовать эта самая библиотека, но другой версии. Чтобы было понятно, после одного из обновлений (в Arch Linux) перестал запускаться

Новая версия Deepin 15 включает в себя новый дизайн Центра Управления и компьютера, он имеет новый размытый и прозрачный стиль, также включены новые взаимодействия для угловой навигации и оконного менеджера наряду с выбором обоев рабочего стола,

Новые возможности в Linux Mint 19.3. Linux Mint 19.3 — это долгосрочный релиз поддержки, который будет поддерживаться до 2023 года. Он поставляется с обновленным программным обеспечением и приносит уточнения и множество новых функций, чтобы сделать

Linux Mint 19 – это релиз с длительной поддержкой до 2023 года. Он поставляется с обновлённым программным обеспечением и приносит усовершенствования и множество новых функций, чтобы сделать ваш рабочий стол более удобным. На момент написания, Linux

Linux Mint 18.1 Serena Cinnamon (Подробный обзор) Подробный обзор Beta версии Linux Mint 18.1 Serena Cinnamon Linux Mint команда объявила о выпуске обновления для 18.x филиала проекта. В новой версии, Linux Mint 18.1, доступен в двух версиях

Linux mint 18.2 Основные новшества Linux Mint 18.2 (MATE, Cinnamon, KDE и Xfce): В состав включены новые версии десктоп-окружений MATE 1.18 и Cinnamon 3.4, оформление и организация работы в которых продолжает развитие идей GNOME 2 — пользователю

Какой линукс выбрать? Какой linux лучше? Сегодня мы разберемся какие дистрибутивы линукс бывают и какой из них самый лучший. Первое что нужно понять: дистрибутивов линуксов очень много, больше 100. Но, как и в любой экосистеме, тут существует

Начало работы с btrfs для Linux. Файловая система B-tree — это файловая система и менеджер томов, объединенные в одно целое. Он предлагает много перспектив для доставки расширенного набора функций файловой системы в Linux.

Команда с гордостью объявляет о выпуске Linux Mint 20” Ulyana » Cinnamon Edition. Linux Mint 20-это долгосрочный релиз поддержки, который будет поддерживаться до 2025 года. Он поставляется с обновленным программным обеспечением и приносит

Linux Mint 20.2 Ума (Uma) Скачать. Самая большая новость в этом месяце-предстоящий выпуск Linux Mint 20.2 “Uma”. Мы надеемся, что БЕТА-версия будет готова к середине июня.

Новости Linux Январь 2017. НОВОСТИ LINUX, UBUNTU 2017 ЯНВАРЬ В Telegram появилась возможность удалить отправленное сообщения В мессенджере Telegram появилась возможность удалить отправленное сообщения. И если раньше оно удалялось только с одной

Обзор Solus 3 с рабочим окружением Budgie Этот релиз включает в себя из-из-коробки поддержка, универсальных программных пакетов для Linux. Поддержка снимков снимает давление со стороны поставщиков программного обеспечения для конкретной платформы,

Все три издания Linux Mint 19 (Cinnamon, MATE, Xfce) в настоящее время доступны для публичного тестирования. Официально новую бета версию планируют представить 4 июня 2018 года. Хотя перед началом публичных тестирования уже отловлено и исправлено

Преимущества и проблемы беспилотных летательных аппаратов БПЛА или беспилотный летательный аппарат представляет собой самолет с дистанционным управлением. Он может работать удаленно в режиме реального времени или запрограммирован для автономного

Новая ICQ (Windows, Linux, Mac, Web) Что нового: Mail Group представила обновленный мессенджер ICQ. Новая версия знаменитой «аськи» стала «умной, быстрой, гибкой». Разработчики добавили несколько интересных функций, которые

RFRemix 26 основанный на Fedora 26 (Russian Fedora) Официально объявили о выходе Fedora 26. Это проект по поддержке пользователей и разработчиков открытого ПО в России. Основная цель проекта — обеспечить, чтобы Fedora полностью отвечала

I’m trying to run a program, but it gives an error:

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

The result of file program was:

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

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.

Bas van Paassen's user avatar

asked Jul 15, 2015 at 5:30

Soongeun Hwang's user avatar

Soongeun HwangSoongeun Hwang

1,5012 gold badges9 silver badges4 bronze badges

1

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.

answered Jul 15, 2015 at 5:39

kos's user avatar

1

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.

answered Sep 10, 2015 at 23:44

Hughie Coles's user avatar

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.

ArrayBolt3-LeftSEForCodidact's user avatar

answered Oct 27, 2016 at 6:41

Nathan Osman's user avatar

Nathan OsmanNathan Osman

31.7k40 gold badges176 silver badges259 bronze badges

2

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/

wjandrea's user avatar

wjandrea

13.8k4 gold badges46 silver badges94 bronze badges

answered Nov 13, 2015 at 22:22

Pavel's user avatar

PavelPavel

3531 gold badge3 silver badges10 bronze badges

1

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.

Videonauth's user avatar

Videonauth

32.6k16 gold badges102 silver badges119 bronze badges

answered Jun 6, 2016 at 13:43

lambzee's user avatar

You must compile your file using an appropriate CPU architecture (x86 for example) and copy the .exe file on your linux machine. Then you can install mono on your linux machine and issue the following command:

mono myprogram.exe

muru's user avatar

muru

188k50 gold badges459 silver badges709 bronze badges

answered Feb 28, 2016 at 19:49

user3578181's user avatar

1

This can also happen if the binary uses a libc implementation which is not libc, such as musl. These days this specific problem is most likely encountered when trying to run a binary with libc in a Docker container with an image based on alpine. There is nothing that can be done to the binary itself to support both environments, because the libc implementation must always be linked statically, i.e. built directly into the binary, for reasons.

answered Jul 16, 2019 at 16:44

Zyl's user avatar

I got this error trying to run a zip file containing an executable rather than extracting it and running the executable itself xD

In addition to the other answers offered here, I suppose there would be a lot of file types that aren’t intended to be executable which could cause this error.

answered May 19, 2020 at 6:05

Alexander Taylor's user avatar

1

This is another special case: WSL (Windows Subsystem for Linux) by default(!) only supports 64bit executables. I think this is a rather unusual behaviour, as normally there is a backwards compatibility.

(Even more special is that selecting 64bit in a formerly 32bit project of Windev won’t fix your issue. You need to start a new project, selecting 64bit right in the beginning. Tested on Windev 26. This IDE sucks, forced to use it because of working legacy code.)

answered Jul 21, 2022 at 23:23

PythoNic's user avatar

PythoNicPythoNic

6761 gold badge5 silver badges15 bronze badges

2

I’m developing a C++ application in Visual Studio, compiled with WSL with G++ on an x64 system

Sorry if this is obvious, but I’m new to developing apps for Linux

/proc/cpuinfo flags:

fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single pti ssbd ibrs ibpb fsgsbase bmi1 hle avx2 smep bmi2 erms invpcid rtm avx512f avx512dq rdseed adx smap clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 arat pku ospke md_clea

This is what I get when I run the executable with «./program.out»:

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

And with «sudo ./program.out»:

./program.out: 1: ./program.out: 1: not found
./program.out: 1: ./program.out: ELF: not found
./program.out: 1: ./program.out: A��878G8G����DD: not found
./program.out: 1: ./program.out: A: not found
./program.out: 1: ./program.out: 1: not found
: No such filents.out: 1: ./BeXCoolAccounts.out: cannot open
./program.out: 2: ./program.out: @!l: not found
: No such filents.out: 1: ./BeXCoolAccounts.out: cannot open �GJ�V�JA
./program.out: 1: ./program.out: %@@@����nnppp-[-[����X�XA1A: not found
./program.out: 2: ./program.out: Syntax error: end of file unexpected

And «file ./program.out»:

./program.out: ELF 64-bit LSB pie executable, x86-64, version 1 (GNU/Linux), no program header, missing section headers

When I was looking for a solution I tried «ldd ./program.out»:

not a dynamic executable

And «strace ./program.out»:

execve("./program.out", ["./program.out"], 0x7ffcc5b8b100 /* 27 vars */) = -1 ENOEXEC (Exec format error)
strace: exec: Exec format error
+++ exited with 1 +++

I’ve also used chmod a+x on the executable, but still nothing

I’m developing a C++ application in Visual Studio, compiled with WSL with G++ on an x64 system

Sorry if this is obvious, but I’m new to developing apps for Linux

/proc/cpuinfo flags:

fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single pti ssbd ibrs ibpb fsgsbase bmi1 hle avx2 smep bmi2 erms invpcid rtm avx512f avx512dq rdseed adx smap clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 arat pku ospke md_clea

This is what I get when I run the executable with «./program.out»:

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

And with «sudo ./program.out»:

./program.out: 1: ./program.out: 1: not found
./program.out: 1: ./program.out: ELF: not found
./program.out: 1: ./program.out: A��878G8G����DD: not found
./program.out: 1: ./program.out: A: not found
./program.out: 1: ./program.out: 1: not found
: No such filents.out: 1: ./BeXCoolAccounts.out: cannot open
./program.out: 2: ./program.out: @!l: not found
: No such filents.out: 1: ./BeXCoolAccounts.out: cannot open �GJ�V�JA
./program.out: 1: ./program.out: %@@@����nnppp-[-[����X�XA1A: not found
./program.out: 2: ./program.out: Syntax error: end of file unexpected

And «file ./program.out»:

./program.out: ELF 64-bit LSB pie executable, x86-64, version 1 (GNU/Linux), no program header, missing section headers

When I was looking for a solution I tried «ldd ./program.out»:

not a dynamic executable

And «strace ./program.out»:

execve("./program.out", ["./program.out"], 0x7ffcc5b8b100 /* 27 vars */) = -1 ENOEXEC (Exec format error)
strace: exec: Exec format error
+++ exited with 1 +++

I’ve also used chmod a+x on the executable, but still nothing

Photo by Jivacore/Shutterstock.com

Linux has been reworked heavily since it first came out to the point that it’s no longer an OS for terminal kings. Just about everyone can use it now thanks to the much better user interfaces that we see in modern Linux distros. However, that doesn’t mean it can’t be frustrating at times. 

In this article, we’re taking a look at the “cannot execute binary file: exec format error” issue and giving you a few solutions on how to get rid of the problem. 

Also read: How to make a file executable in Linux?


Check the architecture

The first thing you should do is ensure you’ve got the right bin file. Binary files made for 32-bit systems won’t work on 64-bit systems and vice-versa. You can check the architecture of any file by using the command below.

file filename

How to fix Cannot execute binary file: exec format error?

If the architecture doesn’t match between your file and the PC you’re running it on, try running the corresponding binary file for the matching architecture. 


Check the file

Binary files can be run on Windows, Linux and macOS. However, binaries made for one OS won’t run on the others. Generally, these files have different file formats to help users distinguish between them. If you’re trying to run a binary file made for Windows on a Linux distro, it’s obviously not going to work. 

If you must run the binary on Linux however, we recommend downloading Wine and using it to run the file. Wine is a compatibility layer capable of running Windows applications on POSIX-compliant operating systems, including Linux and macOS. 


Install GCC and Gfortran

GCC and Gfortran are required for several binary files to compile and execute properly. You can install them by typing the command below in your terminal. 

sudo apt-get install gfortran && sudo apt-get install build-essential

How to fix Cannot execute binary file: exec format error?

Now try running your binary file again and it should run without a problem — fixing the ‘cannot execute binary file’ error.


Uncompress the file

Sometimes binary files are compressed to make them easier to share over the internet. Try uncompressing the file to see if that helps you run it fine. Run the following commands on at a time. 

xz -d ./filename
chmod +x ./filename
./filename

Check file permissions

Another potential reason for your binary file not running could be that the user doesn’t have permission to change or read the file. You can fix this by typing the following command in the terminal. 

chmod +x filename

How to fix Cannot execute binary file: exec format error?

Once the permissions are set, you can run the file by typing this.

./filename

Use Dos2unix

The Dos2unix command can sometimes help binaries made for DOS to run on UNIX systems. Try using the following command to see if your file runs or not. 

dos2unix filename.bin

If we’ve missed out on any fixes that helped you solve the ‘cannot execute binary file’ error, please comment down below with the fix.

Also read: What does ./ mean in Linux?

Yadullah Abidi

Someone who writes/edits/shoots/hosts all things tech and when he’s not, streams himself racing virtual cars.

You can contact him here: [email protected]

ОБЗОР

#include <unistd.h>

int execve(const char *filename, char *const argv[],

char *const envp[]);

ОПИСАНИЕ

execve() выполняет программу, задаваемую аргументом filename. В
filename должно быть указано имя двоичного исполняемого файла или
сценарий, начинающийся со строки вида:

#! интерпретатор [необязательные параметры]

Подробней о сценариях написано далее в «Интерпретируемые сценарии».

argv — это массив строковых параметров, передаваемых новой программе. По
соглашению, в первой строке должно содержаться имя файла, относящееся к
запускаемой программе. envp — это массив строк в формате
ключ=значение, которые передаются новой программе в качестве окружения
(environment). Оба массива argv и envp завершаются указателем null. К
массиву параметров и окружению можно обратиться из вызываемой программой
функции main, если она определена как:

int main(int argc, char *argv[], char *envp[])

При успешном выполнении execve() управление не возвращается, а код,
данные, bss и стек вызвавшего процесса перезаписываются загруженной
программой.

Если текущая программа выполнялась под управлением ptrace, то после
успешного вызова execve() ей посылается сигнал SIGTRAP.

Если у файла программы, указанного в filename, установлен бит set-user-ID
и файловая система, в которой он хранится, не смонтирована с параметром
nosuid (флаг MS_NOSUID у mount(2)), и вызывающий процесс не
выполняется под управлением ptrace, то фактический идентификатор
пользователя вызывающего процесса меняется на идентификатор владельца файла
программы. Точно также, если на файле программы установлен бит set-group-ID,
то фактический идентификатор группы вызывающего процесса становится равным
группе, которой принадлежит файл программы.

Фактический идентификатор пользователя процесса копируется в сохранённый
идентификатор пользователя (set-user-ID), также фактический идентификатор
группы копируется в сохранённый идентификатор группы (set-group-ID). Это
копирование выполняется после изменения любого фактического идентификатора,
которое происходит из-за выставленных бит режима set-user-ID и set-group-ID.

Если исполняемый файл является динамически-скомпонованным файлом в формате
a.out, содержащим заглушки для динамических библиотек, то в начале
выполнения этого файла вызывается динамический компоновщик Linux
ld.so(8), который начинает выполнение с загрузки общих объектов в память
и компонует их с исполняемым файлом.

Если исполняемый файл является динамически компонуемым файлом в формате ELF,
то для загрузки необходимых общих объектов используется интерпретатор,
указанный в сегменте PT_INTERP. Для программ, скомпонованных с glibc, обычно
это /lib/ld-linux.so.2.

При вызове execve() сохраняются все свойства процесса, за исключением:

*
Значения обработчиков всех захватываемых сигналов сбрасываются в значения по
умолчанию (signal(7)).
*
Любой альтернативный стек сигнала не сохраняется (sigaltstack(2)).
*
Проецирование памяти не сохраняется (mmap(2)).
*
Подключённые общие сегменты памяти System V отключаются (shmat(2)).
*
Области общей памяти POSIX становятся неспроецированными (shm_open(3)).
*
Открытые дескрипторы в очереди сообщений POSIX закрываются
(mq_overview(7)).
*
Все открытые именные семафоры POSIX закрываются (sem_overview(7)).
*
Таймеры POSIX не сохраняются (timer_create(2)).
*
Все открытые потоки каталогов (directory streams) закрываются
(opendir(3)).
*
Блокировки памяти не сохраняются (mlock(2), mlockall(2)).
*
Обработчики завершения работы (exit handlers) не сохраняются (atexit(3),
on_exit(3)).
*
Окружения плавающей точки сбрасываются в настройки по умолчанию
(fenv(3)).

В POSIX.1 определён список сохраняемых свойств процесса. Следующие свойства
процесса, имеющиеся только в Linux, также не сохраняются при execve():

*
Устанавливается флаг PR_SET_DUMPABLE (prctl(2)), если выполняемая
программа не имеет установленных бит set-user-ID или set-group-ID; в
противном случае он очищается.
*
Флаг PR_SET_KEEPCAPS (prctl(2)) очищается.
*
(Начиная с Linux 2.4.36 / 2.6.23) Если выполняется программа с установленным
битом set-user-ID или set-group-ID, то сигнал о смерти родителя,
установленный prctl(2) с флагом PR_SET_PDEATHSIG, очищается.
*
Имя процесса, установленное через prctl(2) PR_SET_NAME (и отображаемое
ps -o comm), изменяется на имя нового исполняемого файла.
*
Флаг SECBIT_KEEP_CAPS securebits очищается. Смотрите
capabilities(7).
*
Сигнал завершения (termination signal) устанавливается в SIGCHLD
(clone(2)).
*
Таблица файловых дескрипторов не является общей, отменяется действие флага
CLONE_FILES у clone(2).

Также стоит учитывать следующее:

*
Все нити (threads), отличные от вызывающей, уничтожаются
execve(). Мьютексы, условные переменные и другие объекты pthreads не
сохраняются.
*
При запуске программы выполняется эквивалент setlocale(LC_ALL, «C»).
*
В POSIX.1 указано, что действия по отношению к любым игнорируемым или
имеющим настройку по умолчанию сигналам, остаются неизменными. В POSIX.1
есть одно исключение: если SIGCHLD игнорируется, то реализация может
оставить обработку сигнала (disposition) неизменной или вернуть настройку по
умолчанию; в Linux используется первое.
*
Все ожидающие выполнения асинхронные операции ввода-вывод отменяются
(aio_read(3), aio_write(3)).
*
Как происходит обработка мандатов (capabilities) при вызове execve(),
см. capabilities(7).
*
По умолчанию, после execve() файловые дескрипторы остаются
открытыми. Файловые дескрипторы, помеченные как close-on-exec (закрывать при
запуске), закрываются; смотрите описание FD_CLOEXEC в fcntl(2) (если
файловый дескриптор закрыт, это приводит к освобождению всех имеющихся
блокировок, полученных на соответствующий файл данным процессом. Подробней
смотрите fcntl(2)). В POSIX.1 сказано, что если бы файловые дескрипторы
0, 1 и 2 были закрыты после успешного вызова execve(), и процесс получил
бы привилегии из-за установленных битов режима set-user_ID или set-group_ID
на исполняемом файле, то система смогла бы открыть произвольный файл для
каждого из этих дескрипторов. Считается, что переносимая программа, с
привилегиями или без, не может рассчитывать, что эти три файловых
дескриптора будут оставаться закрытыми после execve().

Интерпретируемые сценарии

Интерпретируемый сценарий — это текстовый файл, у которого установлен бит
выполнения и первая строка имеет вид:

#! интерпретатор [необязательные параметры]

В поле интерпретатор должно быть указано имя файла запуска, это не имя
самого файла сценария. Если в аргументе filename для execve() указан
интерпретируемый сценарий, то интерпретатор будет вызван со следующими
параметрами:

интерпретатор [необязательный параметр] имя файла параметр...

где параметр… — последовательность слов, указываемых аргументом argv
в execve() начиная с argv[1].

В целях переносимости, необязательный параметр должен быть или пустым,
или задаваться одним словом (т.е., не должен содержать пробельных символов);
см. ЗАМЕЧАНИЯ далее.

Ограничения на размер параметров и окружения

Большинство реализаций UNIX накладывает некоторые ограничения на полный
размер параметра командной строки (argv) и окружения (envp), которые
можно передать новой программе. POSIX.1 позволяет реализации объявить это
ограничение через константу ARG_MAX (определённую в <limits.h>
или сделать её доступной во время выполнения через вызов
sysconf(_SC_ARG_MAX)).

В ядре Linux до версии 2.6.23 размер памяти, используемый для хранения
окружения и строк параметров, был ограничен 32 страницами (определялся
ядерной константой MAX_ARG_PAGES). На архитектурах с 4-КиБ размером
страницы это давало максимальный размер в 128 КиБ.

Начиная с ядра версии 2.6.23, большинство архитектур поддерживают предельный
размер, высчитываемый от мягкого ограничения ресурса RLIMIT_STACK
(см. getrlimit(2)), который действует во время вызова
execve(). (Исключение составляют архитектуры без механизма управления
памятью: в них ограничение рассчитывается как и до версии 2.6.23.) Это
изменение позволяет программам иметь больший список параметров и/или
окружения. Для этих архитектур полный размер ограничен до 1/4 разрешённого
размера стека. (Накладываемое ограничение в 1/4 позволяет новой программе
всегда иметь некоторое пространство под стек.) Начиная с Linux версии
2.6.25, ядро отводит нижние 32 страницы для этого предельного размера,
поэтому, даже когда RLIMIT_STACK задан слишком низко, приложения
гарантированно получат, по крайней мере, столько же пространства под
параметры и окружение, сколько бы они получили при работе с Linux 2.6.23 и
ранее. (Это гарантия не обеспечивалась в Linux 2.6.23 и 2.6.24.) Также,
размер строки ограничен 32 страницами (ядерная константа MAX_ARG_STRLEN),
а максимальное число строк может быть 0x7FFFFFFF.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении execve() не возвращает управление. В случае
ошибки возвращается -1, а errno устанавливается в соответствующее
значение.

ОШИБКИ

E2BIG
Слишком большое общее количество байт для окружения (envp) и списка
параметров (argv).
EACCES
В одном из каталогов префикса filename или интерпретатора не разрешён
поиск. (см. также path_resolution(7))
EACCES
Файл или интерпретатор не являются обычным файлом.
EACCES
Не установлен бит выполнения на файле или сценарии или интерпретаторе ELF.
EACCES
Файловая система смонтирована с noexec.
EAGAIN (начиная с Linux 3.1)
Из-за изменения реального UID одним из вызовов set*uid() ранее,
вызывающий всё ещё превышает ограничитель ресурса RLIMIT_NPROC (смотрите
setrlimit(2)). Подробное объяснение этой ошибки смотрите в ЗАМЕЧАНИЯХ.
EFAULT
Значение filename или один из указателей в векторах argv или envp
указывает за пределы доступного адресного пространства.
EINVAL
Исполняемый ELF-файл содержит более одного сегмента PT_INTERP (т.е., в нём
указано более одного интерпретатора).
EIO
Произошла ошибка ввода-вывода.
EISDIR
Интерпретатор ELF является каталогом.
ELIBBAD
Не распознан формат интерпретатора ELF.
ELOOP
Во время определения filename, имени сценария или интерпретатора ELF
встретилось слишком много символьных ссылок.
EMFILE
Было достигнуто ограничение по количеству открытых файловых дескрипторов на
процесс.
ENAMETOOLONG
Слишком длинное значение аргумента filename.
ENFILE
Достигнуто максимальное количество открытых файлов в системе.
ENOENT
Файл filename, сценарий или интерпретатор ELF не существует, или не
найдена динамическая библиотека, необходимая для файлового интерпретатора.
ENOEXEC
Не распознан формат исполняемого файла, он не подходит для архитектуры, или
имеет ошибки в формате, из-за чего не может быть выполнен.
ENOMEM
Недостаточное количество памяти ядра.
ENOTDIR
Компонент пути в filename, сценарии или интерпретаторе ELF в
действительности не является каталогом.
EPERM
Файловая система смонтирована с nosuid, пользователь не является
суперпользователем, а на файле установлен бит set-user-ID или set-group-ID.
EPERM
Над процессом выполняется трассировка, пользователь не имеет прав
суперпользователя, а у файла установлен бит set-user-ID или set-group-ID.
ETXTBSY
Заданный исполняемый файл был открыт на запись одним или более процессов.

СООТВЕТСТВИЕ СТАНДАРТАМ

POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD. В POSIX не описано поведение #!,
но это существует (в нескольких вариантах) в других системах UNIX.

ЗАМЕЧАНИЯ

Над процессами с установленными set-user-ID и set-group-ID не может
выполняться ptrace(2).

Результат работы при монтировании файловой системы с параметром nosuid
различается в разных версиях ядра Linux: некоторые будут отказывать в
запуске исполняемых файлов с установленными битами set-user-ID и
set-group-ID, если это дало бы пользователю больше прав чем уже есть (и
возвращать EPERM), другие просто проигнорируют биты set-user-ID и
set-group-ID и успешно выполнят exec().

В Linux значения argv и envp могут быть равны NULL. В обоих случаях,
это работает также, как если аргумент бы содержал указатель на список с
единственным указателем null. Не пользуйтесь преимуществом данной
нестандартной и непереносимой возможностью!
В многих других системах UNIX
указание argv равным NULL приводит к ошибке (EFAULT). Некоторые
другие системы UNIX при envp==NULL работают также как Linux.

В POSIX.1 указано, что значения, возвращаемые sysconf(3), должны быть
неизменны в течении существования процесса. Однако, начиная с версии Linux
2.6.23, если изменяется ограничение ресурса RLIMIT_STACK, то значение,
возвращаемое для _SC_ARG_MAX, также будет изменено, чтобы отразить, что
ограничение на пространство для хранения параметров командной строки и
окружения было изменено.

В большинстве случаев отказа execve() управление возвращается в
первоначально исполняемый образ и вызывающий execve() может обработать
ошибку. Однако в (редких) случаях (обычно вызванных отсутствием ресурсов),
ошибка может возникнуть после точки невозврата: первоначально исполняемый
образ уже разрушен, а новый образ ещё сознан не полностью. В таких случаях
ядро убивает процесс сигналом SIGKILL.

Интерпретируемые сценарии

Максимальная длина первой строки с указанным интерпретатором сценариев — 127
символов.

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

В Linux игнорируются биты set-user-ID и set-group-ID на файлах со
сценариями.

execve() и EAGAIN

Это более подробное объяснение ошибки EAGAIN, которая возвращается
(начиная с Linux 3.1) при вызове execve().

Ошибка EAGAIN может возникать, когда предшествующий вызов
setuid(2), setreuid(2) или setresuid(2) приводит к изменению у
процесса реального идентификатора пользователя и это изменение приводит к
тому, что процесс превышает свой ограничитель ресурса RLIMIT_NPROC
(т. е., количество процессов, принадлежащих новому реальному UID, превышает
ограничитель ресурса). В версиях Linux с 2.6.0 по 3.0, это приводит к ошибке
вызова set*uid() (до версии 2.6 ограничитель ресурса не учитывался для
процессов, которые изменили идентификатор пользователя).

Начиная с Linux 3.1, описанный сценарий больше не приводит к ошибке в вызове
set*uid(), так как это слишком часто приводило к дырам в безопасности,
когда некорректное приложение не проверяет возвращаемое состояние и
предполагает, что если вызывающий имеет права root, то вызов всегда
выполняется успешно. Вместо этого вызов set*uid() теперь успешно изменяет
реальный UID, но ядро устанавливает внутренний флаг с именем
PF_NPROC_EXCEEDED, который означает, что был превышен ограничитель
ресурса RLIMIT_NPROC. Если флаг PF_NPROC_EXCEEDED установлен и
ограничитель ресурса всё ещё превышен на момент последующего вызова
execve(), то вызов завершается с ошибкой EAGAIN. Такая логика ядра
гарантирует, что ограничитель ресурса RLIMIT_NPROC будет учтён при
обычной последовательности действий для привилегированных служб, а именно —
fork(2) + set*uid() + execve().

Если ограничитель ресурса был не превышен на момент вызова execve() (так
как другие процессы, принадлежащие этому реальному UID завершили работу
между вызовом set*uid() и execve()), то вызов execve() выполнится
успешно и ядро очистит флаг PF_NPROC_EXCEEDED у процесса. Флаг также
очищается, если при успешном выполнении процессом последующего вызова
fork(2).

Историческая справка

В UNIX V6 список аргументов вызова exec() заканчивался 0, а список
аргументов main заканчивался -1. Поэтому, этот список аргументов не мог
быть использован напрямую в последующем вызове exec(). Начиная с UNIX V7
оба списка стали оканчиваться NULL.

ПРИМЕР

Данная программа запускается второй программой, представленной ниже. Она
просто выводит свои параметры командной строки по одному на строку.

/* myecho.c */
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{
    int j;
    for (j = 0; j < argc; j++)
        printf("argv[%d]: %sn", j, argv[j]);
    exit(EXIT_SUCCESS);
}

Эта программа может использоваться для запуска программы, чьё имя указано в
параметре командной строки.

/* execve.c */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
    char *newargv[] = { NULL, "hello", "world", NULL };
    char *newenviron[] = { NULL };
    if (argc != 2) {
        fprintf(stderr, "Использование: %s <file-to-exec>n", argv[0]);
        exit(EXIT_FAILURE);
    }
    newargv[0] = argv[1];
    execve(argv[1], newargv, newenviron);
    perror("execve");   /* execve() возвращается только при ошибке */
    exit(EXIT_FAILURE);
}

Мы можем использовать вторую программу для запуска первой:

$ cc myecho.c -o myecho
$ cc execve.c -o execve
$ ./execve ./myecho
argv[0]: ./myecho
argv[1]: hello
argv[2]: world

Также мы можем использовать эти программы для демонстрации использования
интерпретатора сценариев. Для этого создадим сценарий, чей «интерпретатор»
указывает на нашу программу myecho:

$ cat > script
#!./myecho script-arg
^D
$ chmod +x script

Теперь мы можем использовать нашу программу для запуска сценария:

$ ./execve ./script
argv[0]: ./myecho
argv[1]: script-arg
argv[2]: ./script
argv[3]: hello
argv[4]: world

Image 1133

Image 1134

Image 1135

———-

1) sudo chmod +x ./joxi.run
2) ./joxi.run

3) (Запускается только до перезагрузки ПК и только через root)

root@alexandr-kdeneon:~/joxi# ./joxi.sh

QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to ‘/tmp/runtime-root’

Autorization::Autorization(QObject*) QThread(0x5617d599a3a0)

void Autorization::listen() *2 62000

settings

bool Setting::connectDatabase() QThread(0x5617d599a3a0)

connectToDatabase /root/.joxi/setting

void SqlWorker::connectToDatabase(QString) «/root/.joxi/setting»

db.open()

———-

После каждой перезагрузки ПК, Joxi перестаёт запускаться и заново надо его переустанавливать.

Скрипт joxi.sh выдаёт ошибку «execvp: Ошибка формата выполняемого файла«.

—————

alexandr@alexandr-kdeneon:~/Загрузки$ sudo chmod +x ./joxi.run

[sudo] пароль для alexandr:

alexandr@alexandr-kdeneon:~/Загрузки$ sudo su

root@alexandr-kdeneon:/home/alexandr/Загрузки# ./joxi.run

Creating directory joxi

Verifying archive integrity… 100% MD5 checksums are OK. All good.

Uncompressing Joxi — best screenshot capture 100%

—————

alexandr@alexandr-kdeneon:~/joxi$ ls -l

итого 88328

-rwx—— 1 alexandr alexandr 351 июн 5 22:32 install.sh

-rwx—— 1 alexandr alexandr 4305176 июн 5 22:32 joxi

-rwx—— 1 alexandr alexandr 86 июн 5 22:32 joxi.desktop

-rwx—— 1 alexandr alexandr 50 июн 5 22:32 joxi.sh

—————

alexandr@alexandr-kdeneon:~/joxi$ ./joxi
qt.qpa.plugin: Could not load the Qt platform plugin «xcb» in «» even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl, xcb.

Аварийный останов
alexandr@alexandr-kdeneon:~/joxi$ sudo ./joxi
[sudo] пароль для alexandr:
qt.qpa.plugin: Could not load the Qt platform plugin «xcb» in «» even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl, xcb.

Аварийный останов

—————

Operating System: KDE neon 5.18
KDE Plasma Version: 5.18.5
KDE Frameworks Version: 5.70.0
Qt Version: 5.14.2
Kernel Version: 5.3.0-53-generic
OS Type: 64-bit

На чтение 2 мин Опубликовано 06.04.2020

крипты работали очень хорошо, когда я выполнял их напрямую,  например «./script.sh» и «sh script.sh».

Но они не работали, когда я запускал их командой run-parts.

Для тех, кто интересуется, команда run-parts запускает все скрипты в каталоге.

Если вы получили такую ошибку при запуске скрипта, этот быстрый совет поможет вам исправить ошибку «Exec format error» при запуске скриптов с командой run-parts на Linux.

Решение ошибки «Exec format» при запуске скриптов командой run-parts

Чтобы запустить все скрипты в папке «Documents», я запустил:

$ run-parts --regex '^s.*.sh$' Documents

Я получил следующее сообщение об ошибке:

run-parts: failed to exec Documents/script1.sh: Exec format error
run-parts: Documents/script1.sh exited with return code 1
run-parts: failed to exec Documents/script2.sh: Exec format error
run-parts: Documents/script2.sh exited with return code 1
run-parts: failed to exec Documents/script3.sh: Exec format error
run-parts: Documents/script3.sh exited with return code 1
run-parts: failed to exec Documents/script4.sh: Exec format error
run-parts: Documents/script4.sh exited with return code 1

Чтобы исправить «ошибку формата Exec», вам нужно добавить шебанг в начале ваших скриптов, чтобы ядро знало, как их запускать.

Для тех, кому интересно, шебанг – это последовательность символов, состоящая из знака числа символов и восклицательного знака (#!) в начале скрипта.

Когда вы добавляете shebang в начале текстового файла, он интерпретируется как исполняемый файл.

Большинство скриптов начинается с шебанга.

Вот несколько типичных примеров Шебанга:

Bourne shell, или совместимый шеллl:

#!/bin/sh

Bash:

Perl:

Python 2.x:

Python 3.x:

#!/usr/bin/python3

Это то, что мы называем шебанг.

Теперь вернемся к теме.

Отредактируйте ваши скрипты, используя ваш любимый редактор:

$ nano Documents/itsecforu.sh

Добавьте шебанг в начале скрипта:

#!/bin/sh

Теперь вы можете без проблем запускать скрипты с помощью команды run-parts, используя команду run-parts.

Вы также можете использовать утилиту ShellCheck для поиска проблем в своих скриптах оболочки.

Пожалуйста, не спамьте и никого не оскорбляйте.

Это поле для комментариев, а не спамбокс.

Рекламные ссылки не индексируются!

Перейти к содержимому

Ситуация

При запуске программы через меню приложений возникает эта ошибка, программа не запускается.

Я встречал это на Oracle SQLDeveloper любой версии 20+, который устанавливался из официального rpm в среде Ubuntu + KDE с помощью sudo alien -dic. Ошибки не было в MATE. Может не встречаться в GNOME. Встретил только в KDE.

Ошибки нет, если запустить программу напрямую из терминала.

Ошибки нет, если запустить desktop-файл через gio launch.

Выдача прав a+x на desktop-файлы не помогает.

Запуск через kioclient5 exec прерывается ошибкой:

Неизвестная ошибка 100
execvp: Ошибка формата выполняемого файла
Отправьте сообщение об ошибке на https://bugs.kde.org

Проблема

Команда в desktop-файле:

[Desktop Entry]
...
Exec=sqldeveloper
...

Проверяем в терминале:

$ which sqldeveloper
/usr/local/bin/sqldeveloper

$ file "$(which sqldeveloper)"
/usr/local/bin/sqldeveloper: ASCII text

$ head -2 "$(which sqldeveloper)"
/opt/sqldeveloper/sqldeveloper.sh

$ cat /opt/sqldeveloper/sqldeveloper.sh
#!/bin/bash
cd "`dirname $0`"/sqldeveloper/bin && bash sqldeveloper $*

Вывод простой: штатный desktop-файл ссылается на шелл-скрипт без шибенга, который запускает шелл-скрипт с шибенгом. Проблема именно в первом.

Решение

  1. Изменить параметр Exec в desktop-файле на корректный скрипт или бинарник.
  2. Добавить шибенг в первый шелл-скрипт, тогда результат должен быть таким:
$ file "$(which sqldeveloper)"
/usr/local/bin/sqldeveloper: Bourne-Again shell script, ASCII text executable

Предполагаю, что аналогичное решение подойдёт для другого ПО. По крайней мере, стоит попробовать.

Перейти к содержимому

Ситуация

При запуске программы через меню приложений возникает эта ошибка, программа не запускается.

Я встречал это на Oracle SQLDeveloper любой версии 20+, который устанавливался из официального rpm в среде Ubuntu + KDE с помощью sudo alien -dic. Ошибки не было в MATE. Может не встречаться в GNOME. Встретил только в KDE.

Ошибки нет, если запустить программу напрямую из терминала.

Ошибки нет, если запустить desktop-файл через gio launch.

Выдача прав a+x на desktop-файлы не помогает.

Запуск через kioclient5 exec прерывается ошибкой:

Неизвестная ошибка 100
execvp: Ошибка формата выполняемого файла
Отправьте сообщение об ошибке на https://bugs.kde.org

Проблема

Команда в desktop-файле:

[Desktop Entry]
...
Exec=sqldeveloper
...

Проверяем в терминале:

$ which sqldeveloper
/usr/local/bin/sqldeveloper

$ file "$(which sqldeveloper)"
/usr/local/bin/sqldeveloper: ASCII text

$ head -2 "$(which sqldeveloper)"
/opt/sqldeveloper/sqldeveloper.sh

$ cat /opt/sqldeveloper/sqldeveloper.sh
#!/bin/bash
cd "`dirname $0`"/sqldeveloper/bin && bash sqldeveloper $*

Вывод простой: штатный desktop-файл ссылается на шелл-скрипт без шибенга, который запускает шелл-скрипт с шибенгом. Проблема именно в первом.

Решение

  1. Изменить параметр Exec в desktop-файле на корректный скрипт или бинарник.
  2. Добавить шибенг в первый шелл-скрипт, тогда результат должен быть таким:
$ file "$(which sqldeveloper)"
/usr/local/bin/sqldeveloper: Bourne-Again shell script, ASCII text executable

Предполагаю, что аналогичное решение подойдёт для другого ПО. По крайней мере, стоит попробовать.

I’m trying to run a program, but it gives an error:

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

The result of file program was:

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

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.

Bas van Paassen's user avatar

asked Jul 15, 2015 at 5:30

Soongeun Hwang's user avatar

Soongeun HwangSoongeun Hwang

1,5012 gold badges9 silver badges4 bronze badges

1

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.

answered Jul 15, 2015 at 5:39

kos's user avatar

1

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.

answered Sep 10, 2015 at 23:44

Hughie Coles's user avatar

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.

ArrayBolt3's user avatar

answered Oct 27, 2016 at 6:41

Nathan Osman's user avatar

Nathan OsmanNathan Osman

31.8k40 gold badges177 silver badges259 bronze badges

2

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/

wjandrea's user avatar

wjandrea

14k4 gold badges46 silver badges97 bronze badges

answered Nov 13, 2015 at 22:22

Pavel's user avatar

PavelPavel

3631 gold badge3 silver badges10 bronze badges

1

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.

Videonauth's user avatar

Videonauth

32.9k16 gold badges104 silver badges119 bronze badges

answered Jun 6, 2016 at 13:43

lambzee's user avatar

You must compile your file using an appropriate CPU architecture (x86 for example) and copy the .exe file on your linux machine. Then you can install mono on your linux machine and issue the following command:

mono myprogram.exe

muru's user avatar

muru

191k52 gold badges468 silver badges719 bronze badges

answered Feb 28, 2016 at 19:49

user3578181's user avatar

1

This can also happen if the binary uses a libc implementation which is not libc, such as musl. These days this specific problem is most likely encountered when trying to run a binary with libc in a Docker container with an image based on alpine. There is nothing that can be done to the binary itself to support both environments, because the libc implementation must always be linked statically, i.e. built directly into the binary, for reasons.

answered Jul 16, 2019 at 16:44

Zyl's user avatar

I got this error trying to run a zip file containing an executable rather than extracting it and running the executable itself xD

In addition to the other answers offered here, I suppose there would be a lot of file types that aren’t intended to be executable which could cause this error.

answered May 19, 2020 at 6:05

Alexander Taylor's user avatar

1

This is another special case: WSL (Windows Subsystem for Linux) by default(!) only supports 64bit executables. I think this is a rather unusual behaviour, as normally there is a backwards compatibility.

(Even more special is that selecting 64bit in a formerly 32bit project of Windev won’t fix your issue. You need to start a new project, selecting 64bit right in the beginning. Tested on Windev 26. This IDE sucks, forced to use it because of working legacy code.)

answered Jul 21, 2022 at 23:23

PythoNic's user avatar

PythoNicPythoNic

6661 gold badge5 silver badges15 bronze badges

2

You have a 64-bit x86 CPU (indicated by the lm flag in /proc/cpuinfo), but you’re running a 32-bit kernel. The program you’re trying to run requires a 64-bit runtime, so it won’t work as-is: even on a 64-bit CPU, a 32-bit kernel can’t run 64-bit programs.

If you can find a 32-bit build of the program (or build it yourself), use that.

Alternatively, you can install a 64-bit kernel, reboot, and then install the 64-bit libraries required by your program.

To install a 64-bit kernel, run

sudo dpkg --add-architecture amd64
sudo apt-get update
sudo apt-get install linux-image-generic:amd64

This will install the latest 64-bit Xenial kernel, along with various supporting 64-bit packages. Once you reboot, you should find that uname -a shows x86_64 rather than i686. If you attempt to run your program again, it might just work, or you’ll get an error because of missing libraries; in the latter case, install the corresponding packages (use apt-file to find them) to get the program working.

У нас есть две системы RHEL 6, в которых работают идентичные версии ядра и glibc (glibc – 2.12–1.90.el6_3.6). Согласно стандарту POSIX и справочным страницам Linux, если ядро определяет, что исполняемый файл не в исполняемом формате, таком как ELF, и у него нет шебанга (#!) line, функции execl , execlp , execle , execv , execvp и execvpe (но не execve) будут пытаться выполнить этот файл с помощью оболочки POSIX, которая в Linux называется /bin/sh .

Однако в одной из систем выполнение сценария оболочки, первая строка которого : использование функции execvp завершается ошибкой, в то время как на другой машине сценарий выполняется с использованием /bin/sh , как и ожидалось. В частности, мы используем эти тестовые программы; /tmp/test_script сделан исполняемым:

хс:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

extern char **environ;

int main () {
        char *argv[]   = { "/tmp/test_script", NULL };
        char *progname = argv[0];
        if (execvp(progname, argv) == -1) {
                perror("execvp");
                return -1;
        }
}

/ TMP / test_script:

:

echo "Test script called"
exit 0

Мы искали в исходной RPM установленную версию glibc, и она определенно реализует желаемое поведение (execvp — тривиальная оболочка вокруг execvpe):

POSIX /execvpe.c:

if (strchr(file, '/') != NULL)
    {
        /* Don't search when it contains a slash.  */
        __execve(file, argv, envp);

        if (errno == ENOEXEC)
            {
                /* Count the arguments.  */
                int argc = 0;
                while (argv[argc++])
                    ;
                size_t len = (argc + 1) * sizeof(char *);
                char **script_argv;
                void *ptr = NULL;
                if (__libc_use_alloca(len))
                    script_argv = alloca(len);
                else
                    script_argv = ptr = malloc(len);

                if (script_argv != NULL)
                    {
                        scripts_argv(file, argv, argc, script_argv);
                        __execve(script_argv[0], script_argv, envp);

                        free(ptr);
                    }
            }
    }
else
   ︙

Здесь scripts_argv — это простая функция, которая добавляет /bin/sh в список аргументов, а __execve идентична execve , доступному для пространства пользователя через glibc.

Кто-нибудь еще сталкивался с этой проблемой в Linux? Поведение корректно в любой другой системе, на которой я его пробовал.


0

3

Сразу укажу, что я полнейший нуб. Учусь пользоваться линуксом. Сейчас стоит fedora 22. Не запускаются скомпилированные исполняемые файлы. Компилирую СИшные файлики через ком строку. «gcc -c file.c -o file.o» и «gcc file.o -o file».
После этих действий выдает ошибку при запуске через sh «не могу запустить бинарный файл.» Не хочет запускать ни file.o, ни file.
Переустанавливал bash и gcc через ком строку с помощью dnf reinstall, не помогло. Мне интересен любой способ решения этой проблемы, который я буду способен в кратчайшие сроки освоить.

Содержание

  1. Как я могу устранить ошибку «не удается выполнить двоичный файл»?
  2. 7 ответов 7
  3. execvp: Ошибка формата выполняемого файла
  4. bash: ./program: невозможно выполнить двоичный файл: ошибка формата Exec
  5. 6 ответов
  6. bash: ./program: невозможно выполнить двоичный файл: ошибка формата Exec
  7. Решение проблемы с ошибкой «bash: не удаётся запустить бинарный файл: Ошибка формата выполняемого файла»
  8. О разрядности дистрибутивов Linux и о программ
  9. Запуск ARM файлов в Linux
  10. Заключение

Как я могу устранить ошибку «не удается выполнить двоичный файл»?

Когда я захожу через SSH, я вижу только это .

Я ничего не мог сделать здесь. Такие команды, как halt , poweroff , reboot , вернут command not found .

Как я могу это исправить? Я использую Debian Squeeze Linux

7 ответов 7

Обычно это сообщение об ошибке означает, что Linux не распознает файл как сценарий оболочки или как исполняемый файл.

Обычно причиной является запуск исполняемого файла в неправильной архитектуре — если вы попытаетесь запустить исполняемые файлы x86 на процессоре ARM, появится это сообщение.

Возможно, файл /usr/bin/id перезаписан?

Попробуйте запустить его, используя ./executablefilename вместо использования sh executetablefilename. В конце концов, это не скрипт оболочки.

Проблема заключается в запуске двоичного файла для другой архитектуры процессора. Вы можете использовать objdump (из binutils) для проверки архитектуры двоичных файлов. Вы можете использовать uname для проверки архитектуры машины.

Например, я столкнулся с этой ошибкой «невозможно выполнить двоичный файл» при установке FF.Communicator — плагина Firefox для Chrome (поэтому я могу запускать страницы, которые используют Java-апплеты).

    objdump показывает, что двоичный файл является 64-битным elf64-x86-64

uname показывает, что моя машина 32-битная i686

$./FF.Communicator bash:./FF.Communicator: невозможно выполнить двоичный файл $ uname -mpio i686 i686 i386 GNU/Linux $ objdump -a./FF.Communicator./FF.Communicator: формат файла elf64-x86-64./FF.Communicator

objdump на работающем бинарнике на моей машине показывает, что это 32-битный elf32-i386

$ objdump -a /bin /ls /bin /ls: формат файла elf32-i386

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

Для пользователей Mac OSX вы можете узнать информацию об архитектуре определенного файла, используя команду «file»:

Источник

execvp: Ошибка формата выполняемого файла

1) sudo chmod +x ./joxi.run
2) ./joxi.run

3) (Запускается только до перезагрузки ПК и только через root)

QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to ‘/tmp/runtime-root’

void Autorization::listen() *2 62000

bool Setting::connectDatabase() QThread(0x5617d599a3a0)

void SqlWorker::connectToDatabase(QString) «/root/.joxi/setting»

После каждой перезагрузки ПК, Joxi перестаёт запускаться и заново надо его переустанавливать.

Скрипт joxi.sh выдаёт ошибку «execvp: Ошибка формата выполняемого файла«.

/Загрузки$ sudo chmod +x ./joxi.run

[sudo] пароль для alexandr:

/Загрузки$ sudo su

Creating directory joxi

Verifying archive integrity. 100% MD5 checksums are OK. All good.

Uncompressing Joxi — best screenshot capture 100%

-rwx—— 1 alexandr alexandr 351 июн 5 22:32 install.sh

-rwx—— 1 alexandr alexandr 4305176 июн 5 22:32 joxi

-rwx—— 1 alexandr alexandr 86 июн 5 22:32 joxi.desktop

-rwx—— 1 alexandr alexandr 50 июн 5 22:32 joxi.sh

/joxi$ ./joxi
qt.qpa.plugin: Could not load the Qt platform plugin «xcb» in «» even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl, xcb.

/joxi$ sudo ./joxi
[sudo] пароль для alexandr:
qt.qpa.plugin: Could not load the Qt platform plugin «xcb» in «» even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl, xcb.

Operating System: KDE neon 5.18
KDE Plasma Version: 5.18.5
KDE Frameworks Version: 5.70.0
Qt Version: 5.14.2
Kernel Version: 5.3.0-53-generic
OS Type: 64-bit

Источник

bash: ./program: невозможно выполнить двоичный файл: ошибка формата Exec

Я пытаюсь запустить программу, но ошибка происходит следующим образом:

Результатом программы file program был:

Как я могу исправить эту ошибку?

Я использую Ubuntu 14.04.2 (amd64) с VMware. Я также пытался использовать Ubuntu i386, но результат был таким же.

6 ответов

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

Если вам нужно запустить этот исполняемый файл, у вас есть два варианта:

Получите версию исполняемого файла x86-64 (любым способом, если вы не можете получить версию исполняемого файла x86-64, но вы можете получить его исходный код, вы можете попробовать перекомпилировать его на виртуальной машине);

Установите сервер Ubuntu для ARM вместо Ubuntu 14.04.2 (amd64). Для этого требуется либо физическая машина, работающая в архитектуре ARM, либо программное обеспечение для виртуализации, которое может имитировать ее.

Это также может произойти, если вы попытаетесь запустить исполняемый файл x86-64 на 32-разрядной платформе.

В одном конкретном экземпляре я загрузил код Visual Studio и попытался запустить его на моей установке Ubuntu, но я не понял, что в этой виртуальной машине был установлен 32-разрядный Ubuntu. Я получил эту ошибку, но после загрузки 32-разрядной версии она запускалась без проблем.

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

qemu будет выполнять эмуляцию syscall при запуске исполняемого файла. Это работает для большинства двоичных файлов ARM, но есть некоторые из них, которые могут работать некорректно.

Такая ошибка может возникнуть, если выполняются все следующие условия:

  • Исполняемый файл не является файлом, а ссылкой
  • Вы запустите его внутри VM
  • Файл находится в общей папке
  • Ваш хост — это Windows.

Если у вас есть этот файл, скажем, в архиве — попробуйте распаковать его внутри виртуальной машины, в какой-то каталог внутри виртуального диска, а не на папку, привязанную к вашему жесткому диску хост-компьютера, например /myNewDir/

Если в системе установлено более одного java , это может произойти и не будет установлено как значение по умолчанию. В Ubuntu14.04 LTS я мог бы решить эту проблему, выполнив следующие и выбрав java , который мне нужен.

Я выбираю 2 и устанавливаю openjdk-8 по умолчанию. Который не отображал ошибку Exec format error .

Вы должны скомпилировать свой файл с использованием соответствующей архитектуры процессора (например, x86) и скопировать файл .exe на вашу Linux-машину. Затем вы можете установить моно на свою Linux-машину и выпустить следующую команду:

Источник

bash: ./program: невозможно выполнить двоичный файл: ошибка формата Exec

Я пытаюсь запустить программу, но ошибка происходит так:

Результатом file program было:

Как я могу исправить эту ошибку?

Я использую Ubuntu 14.04.2 (amd64) с VMware. Я тоже пробовал с Ubuntu i386, но результат был таким же.

Вы пытаетесь запустить исполняемый файл, скомпилированный для архитектуры ARM на архитектуре x86-64, что очень похоже на запрос вашего процессора, который говорит только по-английски, указывать направление на китайском.

Если вам нужно запустить этот исполняемый файл, у вас есть два варианта:

Получить версию исполняемого файла x86-64 (любым способом; если вам не удается получить версию исполняемого файла x86-64, но вы можете получить его исходный код, вы можете попытаться перекомпилировать его на виртуальной машине );

Установите Ubuntu Server for ARM вместо Ubuntu 14.04.2 (amd64). Для этого требуется либо физическая машина, работающая на архитектуре ARM, либо программное обеспечение для виртуализации, которое может эмулировать ее.

Это также может произойти, если вы попытаетесь запустить исполняемый файл x86-64 на 32-разрядной платформе.

В одном конкретном случае я скачал код Visual Studio и попытался запустить его на своей установке Ubuntu, но я не понял, что я установил 32-битную Ubuntu в эту виртуальную машину. Я получил эту ошибку, но после загрузки 32-разрядной версии, он работал без проблем.

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

qemu затем выполнит эмуляцию syscall при запуске исполняемого файла. Это работает для большинства двоичных файлов ARM, но есть некоторые, которые могут работать неправильно.

Такая ошибка может возникнуть, если выполняются все следующие условия:

  • Исполняемый файл — это не файл, а ссылка
  • Вы запускаете запустить его внутри ВМ
  • Файл находится в общей папке
  • Ваш хост — Windows.

Если вы получили этот файл, скажем, в архиве — попробуйте распаковать его внутри виртуальной машины, в какой-то каталог внутри виртуального диска, а не в папку, сопоставленную, например, с жестким диском хост-машины. /myNewDir/

Вы должны скомпилировать свой файл, используя соответствующую архитектуру ЦП (например, x86), и скопировать файл .exe на свой компьютер с Linux. Затем вы можете установить mono на вашем Linux-компьютере и выполнить следующую команду:

Если java в системе установлено более одного, это может произойти и не будет установлено по умолчанию. На Ubuntu14.04 LTS я мог решить ее, выполнив следующее и выбрав java нужное.

Я выбираю 2 и устанавливаю openjdk-8 по умолчанию. Который не показал Exec format error .

Это также может произойти, если двоичный файл использует реализацию libc, которая не является libc, например, musl. В эти дни эта конкретная проблема, скорее всего, встречается при попытке запуска двоичного файла с libc в контейнере Docker с изображением, основанным на alpine. Ничто не может быть сделано с самим двоичным файлом для поддержки обеих сред, потому что реализация libc всегда должна быть статически связана, то есть встроена непосредственно в двоичный файл, по причинам.

Источник

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

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

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

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

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

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

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

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

Ещё один пример:

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

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

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

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

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

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

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

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

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

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

Заключение

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

Источник

Обновлено: 05.06.2023

Хотя это не должно происходить при использовании официальных репозиториев apt-get, если вы загружаете программное обеспечение из Интернета и запускаете его, есть вероятность, что вы увидите страшные bash: ./nameOfProgram: невозможно выполнить двоичный файл: ошибка формата Exec. Эта ошибка, за которой обычно следует bash: ./nameOfProgram.sh: В доступе отказано или что-то в этом роде означает, что Ubuntu не может правильно взаимодействовать с загруженным вами двоичным файлом. Это потому, что, хотя это, по-видимому, допустимый двоичный файл Linux, он разработан для набора микросхем, отличного от того, который поддерживает ваше ядро.

Способ 1: использование команды arch

Если вы не знакомы с типом микропроцессора, который вы установили на своем компьютере, то сначала вы захотите использовать команду arch из командной строки. После выполнения этой команды вы увидите только одну строку вывода. Во многих случаях вы увидите i686, что означает, что вы используете 32-разрядный процессор и, следовательно, не можете запускать двоичные файлы x86_64. Если вместо этого вы видите amd64 или что-то подобное, то вы работаете на процессоре x86_64 и, по крайней мере, теоретически должны быть в состоянии запустить большинство 32-битных и 64-битных двоичных файлов. В отличие от Microsoft Windows, Ubuntu Linux фактически содержит надлежащие инструменты, позволяющие пользователям 644-битных наборов микросхем запускать 16-битные программы Windows в своей операционной системе во многих случаях.

Вы можете увидеть некоторые другие типы вывода, которые могут еще больше ограничить ваши возможности, когда дело доходит до запуска программного обеспечения. Ubuntu долгое время поддерживала архитектуру PowerPC, которая встречается на некоторых рабочих станциях, а также на многих компьютерах Classic Macintosh и более старых машинах OS X Macintosh. На самом деле вы все еще можете найти репозитории Ubuntu для этих архитектур, хотя сегодня они получают небольшую поддержку. Однако в этом случае вы, скорее всего, не сможете запустить много бинарных файлов Linux, которые вы загружаете из Интернета, за пределами официальных репозиториев. Это не означает, что Ubuntu не работает на этих машинах, хотя вы, возможно, захотите взглянуть на более легкий дистрибутив Lubuntu.

Способ 2: с помощью команды файла

Команда file определяет, какие файлы содержатся, и она обычно очень точная. Попробуйте определить нужный файл, набрав file nameOfProgram чтобы увидеть, если вы получите ELF 32-бит или ELF 64-бит в качестве вывода. Если он говорит вам, что это 64-битный двоичный файл ELF, и вы получили i686 в качестве вывода из команды arch, то вы не сможете разумно запустить его на своем компьютере. Если вы используете 64-битный микропроцессор, работающий под управлением 32-битной Ubuntu, то вы можете технически переустановить операционную систему, хотя это немного экстремальный шаг для запуска одной программы.

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

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

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

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

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

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

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

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

Ещё один пример:

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

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

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

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

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

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

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

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

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

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

Заключение

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

int execve(const char * filename , char *const argv [], char *const envp []);

ОПИСАНИЕ

argv — это массив строк, аргументов новой программы. envp — это массив строк в формате key=value , которые передаются новой программе в качестве окружения (environment). Как argv , так и envp завершаются нулевым указателем. К массиву аргументов и к окружению можно обратиться из функции main (), которая объявлена как int main(int argc, char *argv[], char *envp[]) .

execve() не возвращает управление при успешном выполнении, а код, данные, bss и стек вызвавшего процесса перезаписываются кодом, данными и стеком загруженной программы. Новая программа также наследует от вызвавшего процесса его идентификатор и открытые файловые дескрипторы, на которых не было флага закрыть-при-exec (close-on-exec, COE). Сигналы, ожидающие обработки, удаляются. Переопределённые обработчики сигналов возвращаются в значение по умолчанию. Обработчик сигнала SIGCHLD (когда установлен в SIG_IGN) может быть сброшен или не сброшен в SIG_DFL.

Если текущая программа выполнялась под управлением ptrace, то после успешного execve() ей посылается сигнал SIGTRAP .

Если на файле программы filename установлен setuid-бит, то фактический идентификатор пользователя вызывавшего процесса меняется на идентификатор владельца файла программы. Точно так же, если на файле программы установлен setgid-бит, то фактический идентификатор группы устанавливается в группу файла программы.

Если исполняемый файл является динамически-скомпонованным файлом в формате a.out, содержащим заглушки для вызова разделяемых библиотек, то в начале выполнения этого файла вызывается динамический компоновщик ld.so (8), который загружает библиотеки и компонует их с исполняемым файлом.

Если исполняемый файл является динамически-скомпонованным файлом в формате ELF, то для загрузки разделяемых библиотек используется интерпретатор, указанные в сегменте PT_INTERP. Обычно это /lib/ld-linux.so.1 для программ, скомпилированных под Linux libc версии 5, или же /lib/ld-linux.so.2 для программ, скомпилированных под GNU libc версии 2.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном завершении execve() не возвращает управление, при ошибке возвращается -1, а значение errno устанавливается должным образом.

КОДЫ ОШИБОК

EACCES Интерпретатор файла или скрипта не является обычным файлом. EACCES Нет прав на выполнение файла, скрипта или ELF-интерпретатора. EACCES Файловая система смонтирована с флагом noexec . EPERM Файловая система смонтирована с флагом nosuid , пользователь не является суперпользователем, а на файле установлен бит setuid или setgid. EPERM Процесс работает под отладчиком, пользователь не является суперпользователем, а на файле установлен бит setuid или setgid. E2BIG Список аргументов слишком велик. ENOEXEC Исполняемый файл в неизвестном формате, для другой архитектуры, или же встречены какие-то ошибки, препятствующие его выполнению. EFAULT filename указывает за пределы доступного адресного пространства. ENAMETOOLONG filename слишком длинное. ENOENT Файл filename , или интерпретатор скрипта или ELF-файла не существует, или же не найдена разделяемая библиотека, требуемая файлу или интерпретатору. ENOMEM Недостаточно памяти в ядре. ENOTDIR Компонент пути filename , или интерпретатору скрипта или ELF-интерпретатору не является каталогом. EACCES Нет прав на поиск в одном из каталогов по пути к filename , или имени интерпретатора скрипта или ELF-интерпретатора. ELOOP Слишком много символьных ссылок встречено при поиске filename , или интерпретатора скрипта или ELF-интерпретатора. ETXTBSY Исполняемый файл открыт для записи одним или более процессами. EIO Произошла ошибка ввода-вывода. ENFILE Достигнут системный лимит на общее количество открытых файлов. EMFILE Процесс уже открыл максимально доступное количество открытых файлов. EINVAL Исполняемый файл в формате ELF содержит более одного сегмента PT_INTERP (то есть, в нем указано более одного интерпретатора). EISDIR ELF-интерпретатор является каталогом. ELIBBAD ELF-интерпретатор имеет неизвестный формат.

СООТВЕТСТВИЕ СТАНДАРТАМ

ЗАМЕЧАНИЯ

SUID и SGID процессы не могут быть оттрассированы ptrace() d.

Linux игнорирует SUID и SGID биты на скриптах.

Результат монтирования файловой системы с опцией nosuid различается в зависимости от версий ядра Linux: некоторые ядра будут отвергать выполнение SUID/SGID программ, когда это должно дать пользователю те возможности, которыми он уже не обладается (и возвращать EPERM), некоторые ядра будут просто игнорировать SUID/SGID биты, но успешно производить запуск программы.

Я пытаюсь запустить программу, но ошибка происходит так:

Результатом file program было:

Я использую Ubuntu 14.04.2 (amd64) с VMware. Я тоже пробовал с Ubuntu i386, но результат был таким же.

Это исполняемый файл ARM, т. Е. Вы загрузили неверный формат исполняемого файла или скомпилировали для неправильной платформы. Вы должны получить правильный исполняемый файл или перекомпилировать.

Вы пытаетесь запустить исполняемый файл, скомпилированный для архитектуры ARM на архитектуре x86-64, что очень похоже на запрос вашего процессора, который говорит только по-английски, указывать направление на китайском.

Если вам нужно запустить этот исполняемый файл, у вас есть два варианта:

Получить версию исполняемого файла x86-64 (любым способом; если вам не удается получить версию исполняемого файла x86-64, но вы можете получить его исходный код, вы можете попытаться перекомпилировать его на виртуальной машине );

Установите Ubuntu Server for ARM вместо Ubuntu 14.04.2 (amd64). Для этого требуется либо физическая машина, работающая на архитектуре ARM, либо программное обеспечение для виртуализации, которое может эмулировать ее.

Это также может произойти, если вы попытаетесь запустить исполняемый файл x86-64 на 32-разрядной платформе.

В одном конкретном случае я скачал код Visual Studio и попытался запустить его на своей установке Ubuntu, но я не понял, что я установил 32-битную Ubuntu в эту виртуальную машину. Я получил эту ошибку, но после загрузки 32-разрядной версии, он работал без проблем.

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

qemu затем выполнит эмуляцию syscall при запуске исполняемого файла. Это работает для большинства двоичных файлов ARM, но есть некоторые, которые могут работать неправильно.

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

Такая ошибка может возникнуть, если выполняются все следующие условия:

  • Исполняемый файл — это не файл, а ссылка
  • Вы запускаете запустить его внутри ВМ
  • Файл находится в общей папке
  • Ваш хост — Windows.

Если вы получили этот файл, скажем, в архиве — попробуйте распаковать его внутри виртуальной машины, в какой-то каталог внутри виртуального диска, а не в папку, сопоставленную, например, с жестким диском хост-машины. /myNewDir/

Это очень полезно. Для меня я создал ярлык (ссылку) на этот исполняемый файл, а затем вызвал ярлык ошибки.

Вы должны скомпилировать свой файл, используя соответствующую архитектуру ЦП (например, x86), и скопировать файл .exe на свой компьютер с Linux. Затем вы можете установить mono на вашем Linux-компьютере и выполнить следующую команду:

Если java в системе установлено более одного, это может произойти и не будет установлено по умолчанию. На Ubuntu14.04 LTS я мог решить ее, выполнив следующее и выбрав java нужное.

Я выбираю 2 и устанавливаю openjdk-8 по умолчанию. Который не показал Exec format error .

Это также может произойти, если двоичный файл использует реализацию libc, которая не является libc, например, musl. В эти дни эта конкретная проблема, скорее всего, встречается при попытке запуска двоичного файла с libc в контейнере Docker с изображением, основанным на alpine. Ничто не может быть сделано с самим двоичным файлом для поддержки обеих сред, потому что реализация libc всегда должна быть статически связана, то есть встроена непосредственно в двоичный файл, по причинам.

Читайте также:

      

  • Как сделать фото 3 на 4 в фотошопе
  •   

  • Как отключить всплывающие окна в опере
  •   

  • Не является qr по программе ashyq
  •   

  • Как вставить видео в презентацию powerpoint
  •   

  • Screen lock service что это за программа и нужна ли она на андроид

Понравилась статья? Поделить с друзьями:
  • Предупреждение after effects неизвестная ошибка рисования
  • Предупредить от ошибки или предупредить ошибку
  • Предупредить заранее лексическая ошибка
  • Предугадывание ошибки error guessing eg
  • Предстоящее будущее лексическая ошибка