2015-12-25 5 views
1

Может кто-нибудь объяснить зависимость привязки привязки к архитектуре ОС и платформы, например, если я хочу скомпилировать код для архитектуры arm, следует ли мне искать архитектуру платформы или для ОС, на которой работает платформа а затем адаптироваться к нему?Как связать привязку с архитектурой ОС и платформы

+1

Вопрос не достаточно конкретный. – auselen

+0

Что делает * libc * или стандартная библиотека 'C'? Как насчет [libgcc] (https://gcc.gnu.org/onlinedocs/gccint/Libgcc.html)? Если вы кодируете без вызова стандартной библиотеки, то вам нужно иметь только * libgcc * (или эквивалент), а компилятор не связан с целевой ОС. Конечно, если у целевой ОС есть загрузчик, вы должны получить свой исполняемый файл в формате, поддерживаемом этим (возможно, пользовательскими скриптами компоновщика). Для простого двоичного формата эта часть проста. Например, ядро ​​linux может компилироваться с помощью «arm-none-eabi-gcc» или «arm-linux-gnueabi-gcc», потому что в коде нет функций ОС. –

ответ

3

Большинство компиляторов компилируют свой код на язык ассемблера. Код, который они создают, скорее всего, зависит от различных вызовов операционной системы (например, для распределения динамической памяти) и имеет заголовок, определяющий свойства файла, такие как расположение разделов кода и данных (например, ELF, PE). Затем ассемблер компилирует эту сборку в объектные файлы, которые связаны с помощью компоновщика этой платформы. Все эти инструменты производят код для конкретной архитектуры и ОС.

Это не означает, что компилятор и компоновщик не могут работать на другом типе системы. Процесс компиляции кода для другой системы называется кросс-компиляцией. Хотя это менее часто используется, чем компиляция для той же платформы, на которой работает компилятор, он довольно часто используется. Несколько примеров этого - компиляция ядер ОС, которые, конечно же, не могут полагаться на другую ОС или компилировать собственный код для Android (андроид NDK содержит кросс-компилятор).