GNU/Linux >> Tutoriales Linux >  >> Linux

Mi gestor de arranque no se puede compilar con gcc 4.6 y 4.7 ... solo 4.5

Al compilar un archivo C trivial con las banderas que proporcionó, entre gcc-4.5 y gcc-4.6 y usando objdump -h para examinar la salida, parece que el .eh_frame la sección se introduce en gcc-4.6 .

Los ld El script que proporcionó no se ocupa de esa sección, y probablemente debería hacerlo. Puedes usar strip -R .eh_frame -R .eh_frame_hdr para eliminar esa sección y otras de los archivos de objeto antes de vincular.

De todos modos, dado que el enlazador es el mismo para ambas versiones de gcc, objdump -h en los archivos de objetos indicará la diferencia que causa este problema.


¿Hay algún argumento en la línea de comandos que desactive una función que pueda producir secciones más grandes?

Sí:si te importa el tamaño, debes construir con -Os . El -O3 habilita explícitamente optimizaciones que podrían conducir a un tamaño de código más grande. Dado que el gestor de arranque se ejecuta una vez , usando -O3 porque es casi seguro que está mal.

Editar:

"La optimización en el montaje no tiene sentido...
... y otros objetos aquí..."

es todo de su código en ensamblador? Si es así, el nivel de optimización no tiene sentido, pero entonces debería poder comparar simplemente la salida de readelf -S vga_pm.S.o construido con ambos compiladores, y vea exactamente cuál las secciones son diferentes.

Pero parece más probable que algunos de sus objetos no en ensamblaje, en cuyo caso la diferencia entre -O3 y -Os será bastante significativo.


GCC agrega algunas secciones de depuración no deseadas a su salida binaria (use objdump -h <file> para verlos), suelo poner los que no quiero en un /DISCARD/ regla en mis scripts ld para deshacerme de ellos:

/DISCARD/ : {
        *(.debug_*)
        *(.note*)
        *(.indent)
        *(.comment)
        *(.stab)
        *(.stabstr)
        *(.eh_frame)
}

Linux
  1. ¿`find` con múltiples `-name` y `-exec` ejecuta solo las últimas coincidencias de `-name`?

  2. ¿Recortar con Lvm y Dm-crypt?

  3. Ejecutar secuencia de comandos con ". ¿Y con “fuente”?

  4. ¿Puedes usar anclas ^ $ con Ls?

  5. ¿Qué puedes hacer con un VPS y un servidor en la nube?

Soporte de vida de 32 bits:compilación cruzada con GCC

Tutorial de comandos which y whoami de Linux para principiantes (con ejemplos)

¿Cómo puedo verificar qué puertos están ocupados y qué puertos están libres en mi máquina Linux?

No se puede cambiar el nombre de un archivo cuyo nombre comienza con un guión

Cifre la carpeta en Linux que solo se puede descifrar en ese sistema operativo y dispositivo específicos

¿Cómo puedo usar comodines de estilo ms-dos con ls y mv?