sistema - ¿Qué partes de la base de código están haciendo binarios grandes?
como escribir en codigo binario (3)
GNU binutils tiene herramientas para ayudarlo a determinar el tamaño de cada símbolo o simplemente cada archivo de objeto.
Eche un vistazo al size
por ejemplo: https://manpages.debian.org/jessie/binutils/size.1.en.html
También vale la pena intentar nm
, ya que puede mostrar el tamaño de cada símbolo en el código del objeto: https://manpages.debian.org/jessie/binutils/nm.1.en.html
Inspeccionar cuidadosamente la salida de size
y nm
le dará la intuición de lo que ocupa mucho espacio y lo que no.
Sepa que printf
, sprintf
y muchas de las funciones de biblioteca más complejas a menudo pueden ocupar unos cuantos kB de ROM extra.
El soporte de punto flotante usando soft-floats también aumentará el código en comparación con el uso de hard-float, es decir, el uso de la emulación de software frente a las instrucciones de hardware para manejar el punto flotante.
A veces el compilador agregará una cantidad asombrosa de hinchazón :)
Construí algo de código para un simulador y ahora estoy tratando de usar la cadena de herramientas gratuita de TI para compilar de forma cruzada a un objetivo con 64kb de nvram. El compilador afirma que mi código está a unos 34kb más allá de la ROM:
(...) msp430-elf/bin/ld: region `ROM'' overflowed by 33716 bytes
Otra línea dice que no puede encajar el campo .text
en su espacio asignado. No puedo creer que mis adiciones sean 34kb en total, y mucho menos que los binarios se desborden en esta cantidad.
- Los archivos .o que mi código ha agregado al proyecto son una pequeña fracción (200kb de los 1.9MB) del total del proyecto, y para empezar he sacado una gran cantidad de componentes que estaban en el proyecto.
- Ya estoy pasando el compilador las banderas
-Os -s
. - El nuevo código tiene aproximadamente 100 caracteres de cadenas literales.
- Mi código usa muchas funciones
math.h
(de hecho, es la única parte que hace aritmética de punto flotante), hace una llamada astrtod
y hace una llamada asprintf
¿Existen herramientas o métodos para desglosar lo que está causando que los binarios sean tan grandes?
También está AMAP, una pequeña y fácil interfaz gráfica de usuario para ver los archivos .map: http://www.sikorskiy.net/prj/amap/
Hubiera sido bueno tener una herramienta similar a kdirstat que le permita comparar visualmente los tamaños de los símbolos.
Aunque no es una respuesta directa a la pregunta, terminé usando la implementación CORDIC de Voidware para evitar usar las funciones grandes en <math.h>
: https://github.com/enthdegree/cordic_wrapped
Una vez también tuve problemas de memoria con un pequeño controlador MSP430. La cadena de herramientas de TI está vinculando bibliotecas grandes a su binario si es posible que existan valores negativos o se use un punto flotante. En mi caso, fue alrededor del 10% - 20% del uso total de memoria.
El software gratuito Code Composer Studio de TI proporciona una visualización de memoria muy potente (Ver -> Asignación de memoria)
Lo que me ayudó mucho fue cambiar el modelo de inicialización en la configuración del enlazador y otras opciones de optimización. Actualmente no estoy trabajando con un controlador MSP430, así que no puedo decirle más detalles.