gcc strip symbol

¿Cuál es la diferencia entre "gcc-s" y un comando "strip"?



symbol (4)

"gcc -s" elimina la información de reubicación junto con la tabla de símbolos que no se realiza mediante "strip". Tenga en cuenta que eliminar la información de reubicación tendría algún efecto en la aleatorización del diseño del espacio de direcciones . Ver this enlace

Me pregunto cuál es la diferencia entre estos dos:

  • gcc -s : elimina toda la tabla de símbolos y la información de reubicación del ejecutable.

  • strip : descarta símbolos de los archivos de objeto.

¿Tienen el mismo significado?

¿Cuál usas para:

  • reducir el tamaño del ejecutable?
  • acelerar su funcionamiento?

Hacen cosas similares, pero strip permite un control más detallado sobre lo que se elimina del archivo.


La respuesta aceptada es muy buena, pero solo para complementar sus preguntas adicionales (y también como referencia para cualquiera que termine aquí).

¿Cuál es el equivalente a gcc -s en términos de tira con algunas de sus opciones?

Ambos hacen lo mismo, eliminando la tabla de símbolos por completo. Sin embargo, como señaló @JimLewis, la tira permite un control más preciso. Por ejemplo, en un objeto reubicable, strip --strip-unneeded no eliminará sus símbolos globales. Sin embargo, strip o strip --strip-all eliminaría la tabla de símbolos completa.

¿Cuál usas para reducir el tamaño del ejecutable y acelerar su ejecución?

La tabla de símbolos es una sección no asignable del binario. Esto significa que nunca se carga en la memoria RAM. Almacena información que puede ser útil para depurar purporses, por ejemplo, para imprimir un stacktrace cuando ocurre un bloqueo. Un caso en el que podría tener sentido eliminar la tabla de símbolos sería un escenario en el que tiene serias limitaciones de capacidad de almacenamiento (en ese sentido, gcc -Os -s o make CXXFLAGS="-Os -s" ... es útil como dará como resultado un binario más lento y más pequeño que también se elimina para reducir aún más el tamaño). No creo que la eliminación de la tabla de símbolos dé como resultado un aumento de velocidad por las razones comentadas.

Por último, recomiendo este enlace sobre la eliminación de objetos compartidos: http://www.technovelty.org/linux/stripping-shared-libraries.html


gcc es un compilador / enlazador, su opción -s es algo que se hace al compilar y enlazar . Tampoco es configurable, tiene un conjunto de información que elimina, ni más ni menos.

strip es algo que se puede ejecutar en un archivo objeto que ya está compilado. También tiene una variedad de opciones de línea de comandos que puede usar para configurar qué información se eliminará. Por ejemplo, -g solo elimina la información de depuración que gcc -g agrega.

Tenga en cuenta que strip no es un comando bash, aunque puede que lo esté ejecutando desde un shell bash. Es un comando totalmente separado de bash, parte del conjunto de utilidades binarias de GNU.