2013-10-14 4 views
4

Учитывая, что C является языком системного программирования, как я могу скомпилировать код C в исходный машинный код x86, который можно было бы вызвать без присутствия операционной системы? (IE: Можно предположить, что у меня есть загрузочный сектор, который загружает исходный машинный код с диска в память, а затем переходит непосредственно к первой команде).Как скомпилировать код C в необработанный двоичный файл без ограничений?

И теперь, для бонусных очков: В идеале, я хотел бы скомпилировать с использованием компилятора Visual Studio 2010, потому что у меня его уже есть. В противном случае, что является лучшим способом выполнить задачу, без необходимости устанавливать множество зависимостей или делать большие изменения в изменении всей системы? Я буду компилировать в Windows 7.

+1

Компилятор фактически не добавляет «специфичный для ОС материал» (вы не должны учитывать системные вызовы DOS, Windows или Linux - те, которые находятся в библиотеках). Загрузчик, на который вы должны сосредоточиться, добавляется компоновщиком. Известная «Вам нужна Windows для запуска этой программы», например, заглушка DOS, может быть легко изменена на другую. (Каждый, кто вырос с Windows, не будет знать, о чем я говорю ...) Итак, проверьте, какие параметры компоновщика у вас есть в Visual Studio. Если нет, скомпилируйте код .obj и используйте внешний компоновщик. – usr2564301

ответ

1

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

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

$ objcopy -O binary object.elf object.binary 
1

Во-первых, вы не использовать какие-либо библиотеки, которые требуют системного вызова (PRINTF, Еореп, чтения и т.д.). то вы обычно компилируете файлы C. основное различие - шаг компоновщика, если вы привыкли позволять компилятору c вызывать компоновщик (или позволять некоторым gui сделать это), вам, вероятно, придется взять на себя это вручную в той или иной форме. Конкретное решение зависит от ваших инструментов, вам нужно будет иметь некоторый код начальной загрузки (небольшая сборка, необходимая для того, чтобы покрыть предположения компиляторов и программистов C и запустить точку входа в вашей программе на C) и сценарий компоновщика или параметры правой командной строки для компоновщика для управления адресным пространством для двоичного файла, а также для связывания объектов вместе. Затем в зависимости от формата вывода компоновщика вам может потребоваться преобразовать его в другой бинарный формат (intel hex, srec, exe, com, coff, elf, raw binary и т. Д.), Чтобы быть совместимым с тем местом, где он будет загружен или запустить.