Является ли исполняемый файл Linux «совместимым» с OS X? - PullRequest
22 голосов
/ 25 февраля 2012

Если вы скомпилируете программу, скажем, C, на платформе Linux, а затем портируете ее для использования библиотек MacOS, будет ли она работать?

Является ли основной машинный код, полученный из компилятора, совместимым как для Mac, так и для Linux?

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

Ответы [ 5 ]

31 голосов
/ 25 февраля 2012

Нет, двоичные файлы Linux и Mac OS X не являются кросс-совместимыми.

Во-первых, исполняемые файлы Linux используют формат под названием ELF .

Mac OS Xисполняемые файлы используют формат Mach-O .

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

Кроме того, Linux на самом деле не основан на UNIX.Он имеет ряд общих функций и инструментов с UNIX, но многое из этого связано с вычислительными стандартами, такими как POSIX.

РЕДАКТИРОВАТЬ:

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

6 голосов
/ 25 февраля 2012

В общем, вы можете легко перенести программу на разные бренды Unix.Однако вам необходимо (как минимум) перекомпилировать его на каждой платформе.

Исполняемые файлы (двоичные файлы) нельзя использовать на нескольких платформах, поскольку исполняемый файл тесно связан с ABI операционной системы ( двоичный интерфейс приложения *)1004 *), то есть соглашения о том, как приложение взаимодействует с операционной системой.

Например, если ваша программа печатает строку на консоли с помощью вызова POSIX write, ABI указывает:

  • Как выполняется системный вызов (Linux использовал для вызова программного прерывания 0x80 на x86, теперь он использует специальную инструкцию sysenter)
  • Номер системного вызова
  • Какэто аргументы функции, передаваемые в систему
  • Любое выравнивание
  • ...

И это сильно зависит от операционной системы.

Обратите внимание, что в некоторых случаях могут быть «адаптеры ABI», позволяющие запускать двоичные файлы одной ОС на другую ОС.Например, Wine позволяет запускать исполняемые файлы Windows с различными версиями Unix, NDISwrapper позволяет использовать сетевые драйверы Windows в Linux.

3 голосов
/ 25 февраля 2012

«Байт-код» обычно относится к коду, выполняемому виртуальной машиной (например, для Java или Python).C компилируется в машинный код, который CPU может выполнять напрямую.Машинный язык зависит от аппаратного обеспечения, поэтому он будет одинаковым для любой ОС, работающей на чипе Intel (даже под Windows), но с подробностями того, как машинный код помещается в исполняемый файл и как он интегрируется с системными вызовамии динамически связанные библиотеки отличаются от системы к системе.

Так что нет, вы не можете взять скомпилированный код и использовать его в другой ОС.(Однако существуют «кросс-компиляторы», которые работают на одной ОС, но генерируют код, который будет работать на другой ОС).

1 голос
/ 25 февраля 2012

Ну, может быть ... но, скорее всего, нет.

Но если это так, то это не "потому что оба UNIX", а потому что:

  • Компьютеры Mac в настоящее время используют один и тот же процессор (в прошлом это сильно отличалось)
  • Вы используете программу, которая вообще не зависит ни от какой библиотеки (очень маловероятно)
  • Вы используете одни и те же библиотеки времени выполнения
  • Возможно, вы используете загрузочный / двоичный формат, совместимый с обоими.
1 голос
/ 25 февраля 2012

Нет "базового байт-кода, который приходит от компилятора".Существует только машинный код .

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

Напротив, двоичные файлы Windows могут иногда выполняться под Linux, поскольку Linux предоставляет как загрузчик двоичного формата для формата PE Windows, так и обширную реализацию API (Wine).В принципе, эта идея может быть использована и на других платформах, но я не знаю никого, кто бы писал это для Linux <-> Darwin.Если у вас уже есть исходный код, и он компилируется в Linux, у вас есть хорошие шансы, что он также будет компилироваться под MacOS (конечно, по модулю UI).

...