Pregunta

Mi GCC nativo dice que su triplete es el siguiente.

> gcc -dumpmachine
x86_64-suse-linux

Donde CPU-Vendor-OS son correspondientemente x86_64, SUSE, Linux. Este último significa que los Glibs están en uso (?). Cuando estoy haciendo un sistema de compilación cruzada basado en Busybux, el triplete del compilador es algo así como AVR32-Linux-Uclibc, donde el sistema operativo es 'Linux-Uclibc', lo que significa que se usa UCLIBC.

La diferencia entre 'Linux-Glibc' y 'Linux-Uclibc' es (AFAIU) en el comportamiento de Collect2 y el contenido de Libgcc.a. GLIBC o UCLIBS están vinculados en silencio al binario objetivo.

Las preguntas son cómo se compila el kernel de Linux por los mismos compiladores? Tan pronto como el núcleo se ejecuta en metal desnudo, no debe estar vinculado con ningún tipo de libra de usuario libc, y debe usar libgcc.a apropiado

¿Fue útil?

Solución

GCC tiene todo tipo de opciones para controlar cómo funciona. Aquí hay algunos relevantes:

  • -nostdlib para omitir el enlace a las bibliotecas estándar y el código de inicio
  • -nostdinc Para omitir la búsqueda de archivos de encabezado en las ubicaciones estándar.
  • -ffreestanding compilar para un entorno independiente (como un núcleo)

Tampoco necesita usar GCC para vincular. Puede invocar el enlazador directamente, suministrarlo con su propio mapa de enlazador, código de objeto de inicio y cualquier otra cosa que necesite.

La construcción del núcleo de Linux parece, por razones arbitrarias para no usar -ffreestanding Sin embargo, sí controla la etapa de enlace y garantiza que el núcleo se vincule sin atraer ningún código del espacio de usuario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top