gcc -g vs not -g y strip vs not strip, rendimiento y uso de memoria?

 C Programming >> Programación C >  >> Tags >> GCC
gcc -g vs not -g y strip vs not strip, rendimiento y uso de memoria?


Si el tamaño del archivo binario no es un problema, ¿existen inconvenientes al usar -g y no eliminar los binarios que deben ejecutarse en un entorno crítico para el rendimiento? Tengo mucho espacio en disco, pero el binario consume mucha CPU y usa mucha memoria. El binario se carga una vez y está activo durante varias horas.


EDITAR:


La razón por la que quiero usar archivos binarios con información de depuración es para generar volcados de núcleo útiles en caso de fallas de segmentación.


Respuestas:


El cargador ELF carga segmentos , no secciones; la asignación de secciones a segmentos está determinada por la secuencia de comandos del enlazador utilizada para crear el ejecutable.


La secuencia de comandos del enlazador predeterminado no asigna secciones de depuración a ningún segmento, por lo que se omite.


La información de símbolos viene en dos formas:los símbolos estáticos se procesan fuera de banda y nunca se almacenan como datos de sección; El enlazador genera tablas de símbolos dinámicos y las agrega a un segmento especial que se carga junto con el ejecutable, ya que debe ser accesible para el enlazador dinámico. El strip El comando solo elimina los símbolos estáticos, a los que nunca se hace referencia en un segmento de todos modos.


Por lo tanto, puede usar la información de depuración completa durante todo el proceso, y esto no afectará el tamaño de la imagen ejecutable en la RAM, ya que no está cargada. Esto también significa que la información no se incluye en los volcados del núcleo, por lo que esto tampoco le brinda ningún beneficio aquí.


El objcopy La utilidad tiene una opción especial para copiar solo la información de depuración, por lo que puede generar un segundo archivo ELF que contenga esta información y usar archivos binarios eliminados; al analizar el volcado del núcleo, puede cargar ambos archivos en el depurador:


objcopy --only-keep-debug myprogram myprogram.debug
strip myprogram