#compilation #linker #operating-system #abi #object-files
#Сборник #компоновщик #операционная система #abi #объектные файлы
Вопрос:
Я знаю, что для полных программ это невозможно из-за форматов исполняемых файлов и системных вызовов, однако, если у вас был файл с:
int add(int a, int b) { возвращает a b; }
Не могли бы вы скомпилировать это как объектный файл или статическую библиотеку в Linux, а затем использовать его в macOS или Windows?
Комментарии:
1. Объектные файлы и статические библиотеки также имеют форматы файлов, как и исполняемые файлы. Тогда у вас проблемы с ABI.
Ответ №1:
Компиляция C
кода превращает его в собственный двоичный файл / native image. Это зависит от процессора / ОС, на котором оно скомпилировано (если, конечно, вы не используете кросс-компилятор). Двоичный файл /object не будет запускаться в другой ОС.
Только в случае таких языков, как java
, C#
возможно, что вы можете скомпилировать для одной ОС и запустить на другой (без перестроения). Это потому, что эти языки создают управляемый двоичный файл / object. Этот управляемый объект не запускается непосредственно в ОС. Он выполняется на виртуальной машине (для JVM Java
и CLR для C#
).
Ответ №2:
Могут ли статические библиотеки, которые не полагаются на стандартную библиотеку C, быть скомпилированы в одной ОС, а затем перемещены в другую?
Теоретически; да. Обратите внимание, что компилятор — это всего лишь то, что преобразует основной язык (например, C) во вспомогательный язык (например, возможно, собственный код для конкретной ОС и конкретного процессора; но, возможно, также БАЗОВЫЙ исходный код или исходный код веб-сборки или какой-то переносимый байт-код или что-то еще).
Единственное, что действительно имеет значение, это то, что все, что использует дополнительный язык, понимает дополнительный язык.
На практике; для статических библиотек вторичный язык включает такие вещи, как форматы объектных файлов и соглашения о вызовах; и «все, что использует вторичный язык, понимает вторичный язык», включает понимание формата объектного файла, понимание соглашений о вызовах и т.д. Обычно компиляторы настроены таким образом, что их дополнительный язык соответствует тому, что имеет смысл для компьютера, на котором выполняется компилятор, и из-за этого часто вы не можете скомпилировать статическую библиотеку на одном компьютере и переместить ее на другой компьютер (с другим компилятором и / или операционной системой и / или процессором).
Однако «типичный» не указывает на необходимость. Кросс-компиляторы вполне возможны.
Например, вы можете перенести GCC (и его tools — linker и т.д.) В Windows И использовать свой кросс-компилятор для создания статических библиотек, которые могут использоваться компиляторами, разработанными для Linux (и работающими в Linux); и если вы сделаете это, вы, вероятно, не сможете использовать кросс-компилятор (работающий в Windows) для создания статических библиотек для других компиляторов, которые также работают в Windows.