- Запуск исполняемых файлов.
- Решение проблемы с ошибкой «bash: не удаётся запустить бинарный файл: Ошибка формата выполняемого файла»
- О разрядности дистрибутивов Linux и о программ
- Запуск ARM файлов в Linux
- Заключение
- How to fix Cannot execute binary file: exec format error?
- Check the architecture
- Check the file
- Install GCC and Gfortran
- Uncompress the file
- Check file permissions
- Use Dos2unix
- Yadullah Abidi
Запуск исполняемых файлов.
Сразу укажу, что я полнейший нуб. Учусь пользоваться линуксом. Сейчас стоит fedora 22. Не запускаются скомпилированные исполняемые файлы. Компилирую СИшные файлики через ком строку. «gcc -c file.c -o file.o» и «gcc file.o -o file». После этих действий выдает ошибку при запуске через sh «не могу запустить бинарный файл.» Не хочет запускать ни file.o, ни file. Переустанавливал bash и gcc через ком строку с помощью dnf reinstall, не помогло. Мне интересен любой способ решения этой проблемы, который я буду способен в кратчайшие сроки освоить.
Предлагаешь нам самим догадаться, как именно ты запускаешь этот файл?
[root@localhost программы]# gcc -c pr1.c -o pr1.o [root@localhost программы]# gcc pr1.o -o pr1 [root@localhost программы]# sh pr1 pr1: pr1: не могу запустить бинарный файл [root@localhost программы]# chmod +x pr1 [root@localhost программы]# sh pr1 pr1: pr1: не могу запустить бинарный файл [root@localhost программы]# ls pr1 pr1.c pr1.o адрес [root@localhost программы]# chmod a=x pr1.o [root@localhost программы]# pr1.o bash: pr1.o: команда не найдена. ^C [root@localhost программы]# sh pr1.o pr1.o: pr1.o: не могу запустить бинарный файл [root@localhost программы]# ./pr1.o bash: ./pr1.o: cannot execute binary file: Ошибка формата выполняемого файла [root@localhost программы]# ./pr1 указатель не определен
gcc -c pr1.c -o pr1.o chmod +x pr1.o ./pr1.o
[root@localhost программы]# chmod +x pr1.o
[root@localhost программы]# ./pr1.o
bash: ./pr1.o: cannot execute binary file: Ошибка формата выполняемого файла
Ну фиг его знает. Выложи что ты там собираешь.
kostik87 ★★★★★ ( 29.02.16 09:20:00 MSK )
Последнее исправление: kostik87 29.02.16 09:20:21 MSK (всего исправлений: 1)
Да, вообще все мной собранные проги, которые даже раньше работали, не запускаются.
printf(«указатель не определен»);
Я выложил коментарии. Посмотри, пожалуйста.
Некоторое время назад все работало. Потом линукс «рассыпался». Все проги из автозапуска слетели. Даже граф интерфейс сам не загружается. Ввожу вручную при запуске «startx»
Я установил все обновления в yum’е, какие нашел.
Какие еще системные утилиты могут участвовать в процессе запуска и компиляции? Я подумал, что быть может они не корректно выполняются. Переустанавливал bash и gcc
Может, у тебя там в опциях монтирования noexec какой-нить стоит.
Вот же здесь у тебя всё работало:
[root@localhost программы]# gcc -c pr1.c -o pr1.o [root@localhost программы]# gcc pr1.o -o pr1 [root@localhost программы]# sh pr1 pr1: pr1: не могу запустить бинарный файл [root@localhost программы]# chmod +x pr1 [root@localhost программы]# sh pr1 pr1: pr1: не могу запустить бинарный файл [root@localhost программы]# ls pr1 pr1.c pr1.o адрес [root@localhost программы]# chmod a=x pr1.o [root@localhost программы]# pr1.o bash: pr1.o: команда не найдена. ^C [root@localhost программы]# sh pr1.o pr1.o: pr1.o: не могу запустить бинарный файл [root@localhost программы]# ./pr1.o bash: ./pr1.o: cannot execute binary file: Ошибка формата выполняемого файла [root@localhost программы]# ./pr1 указатель не определен
#include int main() < int* p = NULL; if(p)< printf("%p",&p); >else < printf("указатель не определен\n"); >return 0; >
$ gcc 1.c $ ./a.out указатель не определен
kostik87 ★★★★★ ( 29.02.16 09:49:30 MSK )
Последнее исправление: kostik87 29.02.16 09:49:52 MSK (всего исправлений: 1)
Где это посмотреть? Пока что штудирую одну англоязычную статью по этой теме.
Тьфу ты) Спасибо. Я не заметил. А почему через sh не работает, ты не в курсе?
[root@localhost программы]# ./pr1.o bash: ./pr1.o: cannot execute binary file: Ошибка формата выполняемого файла
Этот файл также не запускается так. Раньше эти файлики запускались вроде. Теперь, конечно, проги писать могу, но было бы интересно разобраться с этой темой окончательно.
Потому, что через sh ты вызываешь командный интерпретатор и на вход ему подаёшь не код скрипта, а бинарный файл.
Воспроизведи последовательность команд, что я привёл в этом сообщении Запуск исполняемых файлов. (комментарий), код с находится в файле 1.c.
Да, так тоже работает. Спасибо
[root@localhost программы]# gcc pr1.c
[root@localhost программы]# ./pr1.out
[root@localhost программы]# ./a.out
А ты не в курсе есть ли какие-нибудь мануалы по линуксу и книги по этой теме? Я только «карманный справочник по командам» Дж.Баррета знаю, лежит в pdf у меня.
Этот файл также не запускается так. Раньше эти файлики запускались вроде.
Нет, раньше они тоже не запускались. Это не исполняемые файлы.
Какой ужас и комментаторы ужас
gcc -c . file.o . Ты понял что это за файл file.o ? Зачем ты его пытаешься запускать?
sh file — sh ожидает в file скрипт на *sh языке.
А ты не в курсе есть ли какие-нибудь мануалы по линуксу и книги по этой теме? Я только «карманный справочник по командам» Дж.Баррета знаю, лежит в pdf у меня.
Для новичка в линуксе, всё сильно привязано к дистрибуриву. Сходи на сайт своего дистрибутива и поищи ссылки на мануалы там. А когда уже обрастёшь шерстью, такие элементарные вопросы и не возникнут.
А ты не в курсе есть ли какие-нибудь мануалы по линуксу
А вообще это больше на троллинг похоже. Лет 15 назад, такой вопрос может и был бы уместен.
Прочитай вот это: http://www.firststeps.ru/linux/general1.html Там разбирается твой вопрос, как компилировать, запускать, что такое *.o файлы и т.п.
Понял. Я перепутал.Помню только лишь то, что он вроде называется объектным.
Спасибо, что подсказали. А то я как новичок так же и не знаю, где про такие вещи читать. Там все на инглише, да? Ну буду, значит, в этом случае учить английский, а пока в случае срочных вопросов иногда буду заглядывать на форум. Пока новых с того момента не появлялось, так что сильно «флудить» не буду.
Не знаю, честно говоря, иногда и как вопросы формулировать, потому что не сильно хорошо владею терминологией.
Решение проблемы с ошибкой «bash: не удаётся запустить бинарный файл: Ошибка формата выполняемого файла»
В операционной системе Linux при запуске скаченного файла, либо при запуске самостоятельно скомпилированного файла вы можете столкнуться с ошибкой:
bash: /путь/до/файла: не удаётся запустить бинарный файл: Ошибка формата выполняемого файла
Если у вас англоязычная локаль, то ошибка будет примерно такой:
bash: ./program: cannot execute binary file: Exec format error
В самой ошибке вместо /путь/до/файла и ./program будет указан путь до файла программы, который вы хотите запустить.
- Причинами данной ошибки могут быть:
- попытка запустить 64-битный файл на 32-битной системе
- файл скомпилирован для другой архитектуры (например, для ARM, а вы пытаетесь запустить его на ПК)
- вы пытаетесь выполнить не исполнимый файл, а ссылку
- файл размещён в совместной (shared) папке
Чтобы получить информацию о файле, который вы пытаетесь запустить, можно использовать утилиту file, после которой укажите путь до файла:
program: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=03ada11d91d298913990bfc074ccc3a380d26b69, with debug_info, not stripped
Здесь мы видим, что файл предназначен для 64-битной системы, об этом говорит запись 64-bit, для процессора с архитектурой x86-64.
program: ELF-32-bit LSB executable, ARM, EABI4 version 1 (SYSV), dynamically linked(uses share libs), for GNU/LINUX 2.6.16, not stripped
Этот файл для 32-битных систем, для процессора с архитектурой ARM EABI4.
Если вы не знаете, какой битности ваша система, то выполните команду:
Для 64-битных систем будет выведено x86_64, а для 32-битных – x86.
О разрядности дистрибутивов Linux и о программ
На компьютер с 32-битным процессором вы можете установить только 32-битную операционную систему и в ней запускать только 32-битные программы.
На компьютер с 64-битным процессором вы можете установить как 64-битную ОС, так и 32-битный Linux. В случае, если вы установили 64-битный дистрибутив Linux, то в нём вы можете запускать и 64-битные программы и 32-битные. А если вы установили 32-битный дистрибутив, то в нём возможно запускать только 32-битные программы.
Итак, если у вас 32-битная система, а файл для 64-битной системы или даже для ARM архитектуры, то у вас следующие варианты:
- скачать файл подходящей для вас битности и архитектуры
- если вы самостоятельно компилировали файл из исходного кода, то заново скомпилируйте для процессора вашей архитектуры
Запуск ARM файлов в Linux
Часто можно запустить исполнимые образы ARM на amd64 системах если установить пакеты binfmt-support, qemu, и qemu-user-static:
sudo apt install binfmt-support qemu qemu-user-static
Заключение
Итак, ошибка формата выполняемого файла с невозможностью запустить бинарный файл возникает из-за несоответствия программы операционной системе или архитектуре процессора. Эта проблема не должна возникать, если вы установили программу из исходных репозиториев (кроме случаев неправильной настройки источников репозитория). При возникновении этой проблемы поищите файл, подходящий для вашей архитектуры или скомпилируйте файл из исходных кодов под архитектуру вашей операционной системы.
How to fix Cannot execute binary file: exec format error?
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.
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
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
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
Once the permissions are set, you can run the file by typing this.
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.
Yadullah Abidi
Yadullah is a Computer Science graduate who writes/edits/shoots/codes all things cybersecurity, gaming, and tech hardware. When he’s not, he streams himself racing virtual cars. He’s been writing and reporting on tech and cybersecurity with websites like Candid.Technology and MakeUseOf since 2018. You can contact him here: [email protected]
I am trying to install Valero and see this error . I have tried all the above but still face same error. This is how I try to install. velero install
–provider aws
–plugins velero/velero-plugin-for-aws:v1.0.0
–bucket velero
–secret-file ./credentials-velero
–use-volume-snapshots=false
–backup-location-config region=minio,s3ForcePathStyle=”true”,s3Url=http://minio.velero.svc:9000
We may earn a commission if you buy something from a link on this page. Thanks for your support.
Please log in again. The login page will open in a new tab. After logging in you can close it and return to this page.