Что на самом деле компилируют C и Assembler? - PullRequest
46 голосов
/ 26 января 2010

Итак, я обнаружил, что программы на C (++) на самом деле не компилируются в простой «бинарный» (возможно, я ошибся здесь, в этом случае, извините: D), но для ряда вещей (таблица символов, вещи, связанные с ОС, ...) но ...

  • Ассемблер "компилируется" в чистый двоичный файл? Это означает, что нет ничего лишнего, кроме ресурсов, таких как предопределенные строки и т. Д.

  • Если C компилируется в нечто иное, чем простой двоичный файл, как этот маленький загрузчик ассемблера может просто скопировать инструкции с жесткого диска в память и выполнить их? Я имею в виду, если ядро ​​ОС, которое, вероятно, написано на C, компилируется в нечто отличное от простого бинарного файла - как загрузчик справится с этим?

edit: я знаю, что ассемблер не "компилируется", потому что в нем есть только набор инструкций вашей машины - я не нашел хорошего слова для того, что ассемблер "собирает". Если он у вас есть, оставьте его здесь как комментарий, и я его заменю.

Ответы [ 12 ]

0 голосов
/ 26 января 2010

Есть много ответов выше для вас, чтобы посмотреть, но я подумал, что добавлю эти ресурсы, которые дадут вам представление о том, что происходит.По сути, в Windows и Linux кто-то пытался создать самый маленький исполняемый файл;в Linux, ELF, Windows, PE.

Оба проходят через чтои почему, и вы используете ассемблеры для создания файлов ELF без использования опций -felf, которые делают это за вас.

Надеюсь, это поможет.

Редактировать - вы также можете взглянуть насборка для загрузчика, подобного той, что есть в truecrypt http://www.truecrypt.org или "stage1" grub (бит, который фактически записывается в MDR).

0 голосов
/ 26 января 2010

С (++) (неуправляемый) действительно компилируется в простой двоичный файл. Некоторые вещи, связанные с ОС - это вызовы функций BIOS и ОС, они разные для каждой ОС, но все еще двоичные.
1. Ассемблер компилируется в чистый двоичный файл, но, как ни странно, он менее оптимизирован, чем C (++)
2. Ядро ОС, как и загрузчик, тоже написано на C, поэтому проблем здесь нет.

Java, Managed C ++ и другие вещи .NET компилируются в некоторый псевдокод (MSIL в .NET), что делает его кросс-платформенным и кросс-платформенным, но для работы требуется локальный интерпретатор или транслятор.

...