Как скомпилировать для автономной среды с 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