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

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

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

10 голосов | спросил Mickey Shine 23 J0000006Europe/Moscow 2009, 05:39:30

4 ответа


0

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

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

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

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

ответил Sam Liao 23 J0000006Europe/Moscow 2009, 06:33:53
0

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

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

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

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


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

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

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

ответил ephemient 23 J0000006Europe/Moscow 2009, 05:50:56
0

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

ответил wazoox 24 J0000006Europe/Moscow 2009, 16:14:14
0

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

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

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

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

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

ответил Daniel Schragl 3 PMpThu, 03 Apr 2014 15:04:46 +040004Thursday 2014, 15:04:46

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132