Предупреждение 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

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

Содержание

  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

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

Содержание

  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.

На компьютер с 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:

Заключение

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

Источник

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.

В операционной системе 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 полностью отвечала

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.

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,5112 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.9k40 gold badges179 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

14.1k4 gold badges48 silver badges98 bronze badges

answered Nov 13, 2015 at 22:22

Pavel's user avatar

PavelPavel

3731 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

33.1k16 gold badges104 silver badges120 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

194k53 gold badges475 silver badges725 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 must log in to answer this question.

Not the answer you’re looking for? Browse other questions tagged

.

While it shouldn’t happen when using the official apt-get repositories, if you download software off the Internet and run it then there’s a chance that you’ll see the dreaded bash: ./nameOfProgram: cannot execute binary file: Exec format error. This error, which is usually followed by bash: ./nameOfProgram.sh: Permission denied or something like it, indicates that Ubuntu wasn’t able to interface correctly with the binary you downloaded. This is because while it’s apparently a valid Linux binary, it’s designed for a different chipset than your kernel currently supports.

Most people using Ubuntu are on 32-bit or 64-bit processors based around a standard architecture that Intel released, regardless of who actually made their microchips. It’s important to remember that 64-bit processors can run in 32-bit mode, so if you’re getting this error even though you have a 64-bit processor there’s a chance you’re running a 32-bit version of Ubuntu. A few simple commands are all it takes to tell what your chip is operating as.

Method 1: Using the arch Command

If you’re not familiar with the type of microprocessor that you have installed on your machine, then you’ll first want to use the arch command from the command line. You’ll only see a single line of output returned to you after running this command. In many cases, you’ll see i686, which means that you’re on a 32-bit processor and therefore can’t run x86_64 binaries. If you instead see amd64 or something similar, then you’re on an x86_64 processor, and should at least theoretically be able to run most 32-bit and 64-bit binaries. Unlike Microsoft Windows, Ubuntu Linux actually contains the proper tools to permit users of 644-bit chipsets to run 16-bit Windows programs in their operating system in many cases as well.

These terms are still true even if you’re not actually using that particular model of microchip. For instance, i686 is how Linux refers to many 32-bit processors even if they aren’t actually Intel 80686 chips. Even if you’re using 64-bit Intel technology, arch might still call your processor an amd64 chip. This doesn’t indicate an error, and can be safely ignored. You can use cat /proc/cpuinfo or more /proc/cpuinfo to find out the exact type of processor you’re using. Since the lines in this file are long, you might want to push F11 before issuing it if you’re using a graphical terminal window. Users of a virtual console, especially those working with Ubuntu server, won’t have to worry quite as much.

You may see some other types of output, which might further restrict your options when it comes to running software. Ubuntu supported PowerPC architecture for the longest time, which is found in some workstations as well as many Classic Macintosh and older OS X Macintosh machines. You can actually still find Ubuntu repositories for these architectures, though they receive little support today. However, you more than likely won’t be able to run many Linux binaries you download from the Internet outside of the official repositories in this case. That doesn’t mean that Ubuntu doesn’t work on these machines, though you may want to look at the lighter Lubuntu distribution.

Method 2: Using the file Command

The file command identifies what different files contain, and it’s usually very accurate. Try identifying the file in question by typing file nameOfProgram to see if you get ELF 32-bit or ELF 64-bit as output. If it tells you that it’s an ELF 64-bit binary and you received i686 as output from the arch command, then there’s no way you can reasonably run it on your machine. If you’re on a 64-bit microprocessor running 32-bit Ubuntu, then you could technically reinstall the operating system, though this is a bit of an extreme step in order to run a single program.

There is also the very real possibility, however slight, that you might instead come across a binary that when you attempt to run it spews out junk characters to the terminal even if you’ve run a malware scan on it. These characters usually take the form of either lozenge-shaped blocks, or alternatively rectangular cubes that have numerical values in them. Some computer scientists call the latter tofu, and represent the Unicode values of characters that your currently installed typefaces won’t be able to display. If the terminal is displaying them like this, then you can rest assured that this is neither a font error nor anything having to do with malware. Rather, this is simply because the compiled microprocessor opcode inside of the binary is so alien to your system that it doesn’t know how to interpret some of the code.

The best way to fix this is to install the proper package for your architecture. If you’re installing packages from inside Ubuntu, then the apt-get system or the graphical Synaptic manager has you covered without any problems. If you’re downloading packages from another distribution, then you’ll need to find the right one for your architecture. Take, for example, Arch Linux’s listing of the gvim package. While the default package features the x86_64 architecture, there’s also one for the i686 chipset. This one will work on 32-bit machines that work with the Intel interrupt structure, but remember that the terms i686 and 32-bit are not mutually inclusive all the time since other chipsets Linux supports actually do feature their own 32-bit implementations.

Users exploring the whole GNU/Linux scene might come across binaries compiled for far more exotic technologies than these. Linux is truly a cross-platform code scene, so you’ll see OpenRISC, MIPS, SPARC, M32R, MN103, ARM, ARC, Alpha and many other standards binaries are compiled to work with. More than likely, you won’t be able to run any of these, though ARM is an extremely popular tablet and smartphone platform. It’s also the platform that the Raspberry Pi is based around, which means if you’re actually running Ubuntu on a mobile device or the Ubuntu MATE distribution for Raspberry Pi you’ll actually need these instead of Intel 32-bit or x86_64 binaries.

Photo of Kevin Arrows

Kevin Arrows

Kevin Arrows is a highly experienced and knowledgeable technology specialist with over a decade of industry experience. He holds a Microsoft Certified Technology Specialist (MCTS) certification and has a deep passion for staying up-to-date on the latest tech developments. Kevin has written extensively on a wide range of tech-related topics, showcasing his expertise and knowledge in areas such as software development, cybersecurity, and cloud computing. His contributions to the tech field have been widely recognized and respected by his peers, and he is highly regarded for his ability to explain complex technical concepts in a clear and concise manner.

Понравилась статья? Поделить с друзьями:
  • Презентация на тему логические ошибки
  • Предпусковой подогреватель камаз 14тс 10 ошибки
  • Презентация на тему огонь ошибок не прощает
  • Предупреждение системы безопасности microsoft excel ошибка сертификата ssl
  • Предупреждение after effects неизвестная ошибка рисования