Usando avr-gcc, avr-ld
Estoy intentando reducir severamente el tamaño del archivo de salida usando fdata-sections -ffunction-sections y gc-sections. Cuando se compila sin estas opciones, tengo una salida de ~ 63 KB, y con estas opciones son ~ 30 KB, por lo que parece genial.
Desafortunadamente, después de cargar y probar la salida, noto que no funciona correctamente. La recolección de basura parece haber eliminado mucho más de lo que esperaba, y al examinar el .map noté que algunos datos clave no existen.
¿Alguna idea de qué en el momento del enlace está causando que estos datos/funciones se descarten? (Me doy cuenta de que esta puede ser una pregunta demasiado esperanzadora con los pocos detalles que proporcioné, si necesita alguna información, por favor pregunte y haré todo lo posible para brindársela)
¿Hay alguna manera de rastrear qué símbolos fueron arrojados por la recolección de basura como si estuvieran "sin usar"?
Sin usar -fdata-sections -ffunction-sections -gc-sections, ¿puedo rastrear las dependencias de un símbolo? (Para verificar que las secciones gc solo recopilaron lo que debería) - Lo noté como una opción, pero sería muy doloroso para mí usar el método sugerido por Verax
EDITAR: líneas de compilador y enlazador
avr-ld -mavrxmega6 -gc-sections -T archivos linkerscript libgcc.a -o firmware.elf
avr-gcc -Wall -Wstrict-prototypes -g -ffunction-sections -fdata-sections -Os -mmcu=atxmega256a3 -fno-jump-tables -std=gnu99 -fpack-struct -fno-common -mcall-prologues -c - o archivo.o archivo.c
Había una opción ld bastante obvia llamada -print-gc-sections para revisar lo que se descarta.
Nunca encontré una manera de rastrear las dependencias en un símbolo, pero terminé sin necesidad de revisar -print-gc-sections.
Encontré esto que describía "secciones mágicas" e imagino que esto es similar a lo que estaba viendo. Hubo muchas secciones personalizadas del enlazador que se descartaron incorrectamente, usé KEEP para evitar el gc de estas, aunque estoy seguro de que ahora no se elimina el código muerto, pero esto puede ser lo mejor que puedo hacer.