Могут ли статические библиотеки, которые не полагаются на стандартную библиотеку C, быть скомпилированы в одной ОС, а затем перемещены в другую?

#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.