Linux

Как исправить ‘невозможность выполнения двоичного файла: Exec format error’ на Ubuntu

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

Большинство людей, использующих Ubuntu, работают на 32- или 64-разрядных процессорах, основанных на стандартной архитектуре, которую выпустила Intel, независимо от того, кто на самом деле произвел их микрочипы. Важно помнить, что 64-битные процессоры могут работать в 32-битном режиме, поэтому если вы получаете эту ошибку, хотя у вас 64-битный процессор, есть вероятность, что вы используете 32-битную версию Ubuntu. Чтобы узнать, в каком режиме работает ваш чип, достаточно выполнить несколько простых команд.

Метод 1: Использование команды arch

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

Эти термины актуальны, даже если вы не используете конкретную модель микрочипа. Например, i686 — это то, как Linux обозначает многие 32-битные процессоры, даже если они на самом деле не являются чипами Intel 80686. Даже если вы используете 64-битную технологию Intel, arch все равно может назвать ваш процессор чипом amd64. Это не указывает на ошибку, и ее можно смело игнорировать. Вы можете использовать кошку /proc/cpuinfo или более /proc/cpuinfo чтобы узнать точный тип используемого процессора. Поскольку строки в этом файле длинные, вам, возможно, захочется нажать F11 перед вводом, если вы используете графическое окно терминала. Пользователям виртуальной консоли, особенно тем, кто работает с сервером Ubuntu, не придется так сильно беспокоиться.

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

Метод 2: Использование файла Command

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

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

Лучший способ исправить это — установить пакет, соответствующий вашей архитектуре. Если вы устанавливаете пакеты из Ubuntu, то система apt-get или графический менеджер Synaptic помогут вам без проблем. Если вы загружаете пакеты из другого дистрибутива, то вам нужно найти подходящий для вашей архитектуры. Возьмем, к примеру, список пакета gvim в Arch Linux’. Хотя пакет по умолчанию предназначен для архитектуры x86_64, есть также пакет для чипсета i686. Эта настройка будет работать на 32-битных машинах, которые работают со структурой прерываний Intel, но помните, что термины i686 и 32-бит не всегда являются взаимоисключающими, поскольку другие чипсеты, поддерживаемые Linux, действительно имеют свои собственные 32-битные реализации.

Пользователи, изучающие всю сцену GNU/Linux, могут встретить двоичные файлы, скомпилированные для гораздо более экзотических технологий, чем эти. Linux — это действительно кросс-платформенная сцена, поэтому вы’ увидите двоичные файлы OpenRISC, MIPS, SPARC, M32R, MN103, ARM, ARC, Alpha и многих других стандартов, скомпилированные для работы. Скорее всего, вы не сможете запустить ни одну из них, хотя ARM является чрезвычайно популярной платформой для планшетов и смартфонов. Это также платформа, на которой основан Raspberry Pi, а значит, если вы запускаете Ubuntu на мобильном устройстве или дистрибутив Ubuntu MATE для Raspberry Pi, вам понадобятся именно они, а не двоичные файлы Intel 32-bit или x86_64.

Добавить комментарий