Есть ли разница между исполняемыми двоичными файлами между дистрибутивами? - PullRequest
10 голосов
/ 23 июня 2009

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

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

Ответы [ 5 ]

13 голосов
/ 23 июня 2009

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

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

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

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


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

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

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

13 голосов
/ 23 июня 2009

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

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

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

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

1 голос
/ 03 апреля 2014

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

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

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

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

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

1 голос
/ 24 июня 2009

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

1 голос
/ 23 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...