2009-06-23 6 views
10

Как все дистрибутивы Linux используют одно и то же ядро, есть ли разница между исполняемыми двоичными файлами?Есть ли разница между исполняемыми двоичными файлами между дистрибутивами?

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

+0

«Что-то о бинарных файлах Linux» - как насчет того, чтобы потратить пару секунд на улучшение этого вопроса? – scobi

+0

Вы всегда можете отредактировать чужой титул/вопрос, хотя, пожалуйста, сделайте это внимательно! –

+0

Вы имеете в виду универсальный доступ к дистрибутивам Linux или по различным архитектурам ...? – LB40

ответ

12

распределение Всех Linux использует один и тот же двоичный формат ELF, но есть еще некоторые отличия:

  1. разная процессорная арка использует набор инструкций.
  2. такая же арка процессора может использовать разные ABI, ABI определяет, как использовать файл регистра, как вызвать/вернуть процедуру. Различные ABI не могут работать вместе.
  3. Даже на той же арке, такой же ABI, это все еще не означает, что мы можем скопировать один двоичный файл в дистрибутив другому. Поскольку большинство двоичных файлов не связаны статически, поэтому они зависят от библиотек под дистрибутивом, что означает, что разные дистрибутивы могут использовать разные версии или различную конфигурацию библиотек.

Так что если вы хотите, чтобы ваша программа запускалась во всех дистрибутивах, вам может потребоваться статически связать версию, зависящую только от syscall ядра, даже если вы можете запустить только указанную арку.

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

+0

Хороший ответ, спасибо! Он дает более ясный ответ на вопрос –

1

Практически все файлы программ Linux используют стандарт ELF.

+0

Я думаю, вы имеете в виду ELF –

+0

Спасибо - проблема с пальцем! –

+0

Можем ли мы каким-то образом изменить ELF двоичного кода? –

12

Все порты Linux (то есть ядро ​​Linux на разных процессорах) используют ELF в качестве формата файлов для исполняемых файлов и библиотек. Специфический двоичный файл ELF помечен единой архитектурой/ОС, на которых он может работать (хотя некоторые ОС имеют совместимость для запуска двоичных файлов ELF из других ОС).

Большинство портов имеют поддержку для старого формата a.out. (Некоторые процессоры достаточно новые, что для них никогда не было никаких исполняемых файлов a.out).

Некоторые порты также поддерживают другие исполняемые форматы файлов; например, порт PA-RISC поддерживает старые исполняемые файлы SOM HP-UX, а порты cLinux (nonmmu) μ поддерживают собственный формат FLAT.

В Linux также есть binfmt_misc, что позволяет пользователям использовать регистраторы для произвольных двоичных форматов. Некоторые дистрибутивы используют это, чтобы иметь возможность выполнять приложения Windows, .NET или Java - на самом деле он все еще запускает интерпретатор, но он полностью прозрачен для пользователя.


Linux на Альфе имеет поддержку загрузки Intel исполняемые файлы, которые работают через em86 эмулятор.

Можно зарегистрировать binfmt_misc для исполняемых файлов других архитектур, для работы с qemu-user.

В теории можно было бы создать новый формат - возможно, зарегистрировать новую «архитектуру» в ELF - для жирных двоичных файлов. Затем нужно было бы загрузить загрузчик ядра binfmt об этом новом формате, и вы не захотите пропустить динамический компоновщик ld-linux.so и целую цепочку построения. В такой функции мало интересовался, и, насколько я знаю, никто не работает над чем-то подобным.

+0

Но возможно ли сделать универсальный бинарный файл linux? –

+0

Спасибо за ваш ответ –

+0

Есть ли способ перечислить все исполняемые форматы во время выполнения, например. 'cat/proc/binfmt'? Я мог только перечислить 'binfmt_misc' с помощью' ls/proc/sys/fs/binfmt_misc'. Самое лучшее, что у меня есть сейчас: 'ls fs/binfmt *' в дереве исходных текстов. –

1

Старые Unixes также использовали формат COFF. В этом формате вы все равно можете найти исполняемые файлы. Linux все еще поддерживает его (я не знаю, если он скомпилирован в текущих дистрибутивах).

+1

Linux, пропущенный непосредственно из a.out в ELF. Несколько портов могут создавать изображение * kernel * в формате ECOFF (MIPS, PowerPC) для совместимости с определенными загрузчиками, а Alpha может поддерживать загрузку COFF для совместимости с неместными исполняемыми файлами, но я не могу найти никаких дальнейших следов этого в современных источниках ядра Linux. – ephemient

1

Если вы хотите создать программу, которая выполняет все дистрибутивы Linux, вы можете рассмотреть возможность использования языков сценариев (как Python и Perl) или платформы язык программирования с независимым как Java.

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

С другой стороны, программы, написанные в Java, скомпилированы перед их распространением, но могут выполняться в любом дистрибутиве Linux, если у него установлена ​​виртуальная виртуальная машина Java.

Кроме того, программы, написанные в Java, могут работать в других операционных системах, таких как MS Windows и Mac OS.

То же самое верно для многих программ, написанных в Python и Perl; однако, будет ли программа или Perl работать в другой операционной системе, зависит от того, какие библиотеки используются этой программой и доступны ли эти библиотеки в других операционных системах.

Смежные вопросы