gcc

  • El utilitario size permite listar los tamaños de las secciones de un archivo binario ejecutable pasado como parámetro, junto con su tamaño total. De esta forma es posible comprender cuánta memoria será utilizada al ejecutar el binario y a su vez examinar cómo está compuesto un ejecutable: cuánta memoria se dedica a datos inicializados; cuánta se utiliza para instrucciones; y cuánta se utiliza para variables o espacio para datos no inicializados.

  • Este artículo explica cómo correr una aplicación de 32 bit (Intel i386) en un sistema Debian de 64 bit (Intel x86-64, o "amd64" según la nomenclatura que utiliza Debian).

  • Al tratar de compilar con gcc un programa en lenguaje C me encontré con este error.

  • Cuando se compila un fuente con gcc, éste genera muchos símbolos de debug. Se trata de información acerca de qué porción de código en lenguaje de alto nivel (en este caso C) implementa qué sección de código máquina en el binario ELF. Los símbolos además identifican dónde (en qué dirección) se ubican las diferentes funciones y variables del programa, a través de una tabla, la cual es utilizada por el linker para relocar el código cuando se enlaza junto con otros archivos objeto.

    Los símbolos aumentan considerablemente el tamaño de los binarios, pues agregan gran cantidad de información que no es código ejecutable, sino que es meta-información acerca del código binario, a ser interpretada eventualmente por el debugger y/o linker. Sin embargo, cuando compilamos un ejecutable para correr en un sistema en producción, difícilmente necesitemos recurrir al debugger (tarea más común en un desarrollador, mantenedor, auditor, investigador o experto en seguridad informática) o al linker (para enlazado del ejecutable). Por lo cual, eliminando los símbolos reduciremos el tamaño final del archivo ejecutable. Sin embargo, los símbolos no aumentan el consumo de memoria, pues no son cargados por el sistema operativo al lanzar un programa, ya que se encuentran en secciones de memoria non-allocable que no son necesarias para la ejecución del programa (sólo se cargan en memoria las secciones allocable).