Подтвердить что ты не робот

Является ли Linux исполняемым "совместимым" с OS X?

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

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

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

4b9b3361

Ответ 1

Нет, Linux и Mac OS X не являются перекрестно-совместимыми.

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

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

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

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

EDIT:

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

Ответ 2

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

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

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

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

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

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

Ответ 3

"байт-код" обычно относится к коду, выполняемому виртуальной машиной (например, для java или python). C компилируется в машинный код, который CPU может выполнять напрямую. Язык машины специфичен для аппаратного обеспечения, поэтому он будет одинаковым для любой ОС, работающей на чипе Intel (даже в Windows), но детали того, как машинный код завернут в исполняемый файл и как он интегрируется с системными вызовами и динамически связанные библиотеки отличаются от системы к системе.

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

Ответ 4

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

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

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

Ответ 5

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

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

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