Как скомпилировать для автономной среды с GCC?

Предполагается, что код, над которым я работаю, можно создать как для размещенных, так и для автономных сред, предоставляя частные реализации некоторых функций stdlib для последнего случая.

Могу ли я надежно проверить это только с помощью GCC на обычной рабочей станции / сервере сборки? Компилировать для автономной среды с GCC

  • Опция "-ffreestanding" выглядела многообещающе, но, похоже, она "только" отключает встроенные модули и правильно устанавливает макрос STDC_HOSTED, но все равно предоставляет все системные заголовки.

  • Опция "-nostdinc" слишком ограничительна; Я все еще хочу использовать заголовки, необходимые для автономной реализации (в частности, stddef.h и limit.h).

Что мне здесь не хватает?

О, и я сейчас использую GCC 4.4.3, скоро обновлюсь до 4.5.0.

2 ответа

Решение

Ну, так как ответа пока нет, я мог бы также описать, как я сделал эту работу. Это довольно просто, хотя в зависимости от целевой системы это может быть утомительно.

Использование "-nostdinc" означает, что в стандартную систему включены пути, которые будут пропущены; другие пути включения, указанные с "-I", конечно же, будут все еще искать заголовки.

Итак, для автономной цели сборки я создаю папку include-freestanding-c89 и связываю там соответствующие системные заголовки - float.h, iso646.h, limit.h, stdarg.h и stddef.h. Другие заголовки могут быть включены в них, в зависимости от вашей платформы, поэтому вам, возможно, придется провести некоторое исследование и установить больше ссылок (отсюда и утомительность, если вам нужно сделать это для нескольких целевых платформ).

Каталог C89 можно затем использовать в качестве базы для include-freestanding-c99, дополнительные ссылки для заголовка - stdbool.h и stdint.h.

Командная строка для использования тогда

gcc -std=c89 -nostdinc -nostdlib -ffreestanding -I include-freestanding-c89 

или же

gcc -std=c99 -nostdinc -nostdlib -ffreestanding -I include-freestanding-c99

Это ксен Makefile использования gcc -print-search-dirs чтобы получить каталог с stddef.h и аналогично, добавляет его с -isystem, то использует -nostdinc строить:

https://github.com/mirage/xen/blob/2676bc915157ab474ee478d929b0928cf696b385/stubdom/Makefile

Другие вопросы по тегам