2010-04-21 10 views
18

Se supone que el código en el que estoy trabajando se puede compilar tanto para entornos alojados como independientes, proporcionando implementaciones privadas para algunas funciones stdlib para este último caso.Compilar para entorno independiente con GCC

¿Puedo probar esto de manera confiable con solo GCC en una estación de trabajo/servidor de compilación normal?

  • El "-ffreestanding" opción parecía prometedor, pero parece que "sólo" desactiva muebles empotrados y establece la macro STDC_HOSTED adecuadamente, todavía ofrece todas las cabeceras del sistema.

  • La opción "-nostdinc" es demasiado restrictiva; Todavía quiero usar los encabezados necesarios para una implementación independiente (en particular, stddef.hy limits.h).

¿Qué es lo que falta aquí?

Ah, y estoy usando GCC 4.4.3 por el momento, actualizará a 4.5.0 "pronto".

+0

curioso ... ¿por qué estás construyendo para los independientes? ¿Estás haciendo uno de esos programas "/ sbin" hardcore? ¿Estás escribiendo un kernel? Solo he visto "-freestanding" mencionado en el contexto de Linux personalizado. –

+0

La respuesta breve es la demanda del mercado. Algunos de nuestros clientes del lado integrado/móvil quieren que nuestro producto sea completamente autónomo. – Christoffer

Respuesta

18

Bueno, como aún no se da ninguna respuesta, podría describir cómo hice esto. Es bastante simple, aunque dependiendo del sistema de destino puede ser tedioso.

El uso de "-nostdinc" significa que el sistema estándar incluye rutas que se omitirán; otras rutas de inclusión dadas con "-I" por supuesto todavía se buscarán encabezados.

Por lo tanto, para el tipo de generación independiente que cree una carpeta 'incluirá-independiente-C89' y vincular las cabeceras de sistema relevantes - float.h, iso646.h, limits.h, stdarg .h y stddef.h - allí. Se pueden incluir otros encabezados en estos, dependiendo de su plataforma, por lo que es posible que tenga que investigar y establecer más enlaces (de ahí la tediosidad si necesita hacer esto para varias plataformas de destino).

El directorio de C89 a continuación, se puede utilizar como base para 'incluirá-independiente-C99', las cabeceras extra al enlace son stdbool.h y stdint.h

La línea de comandos es utilizar entonces

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

o

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