Pregunta:
¿Cómo quitar más que símbolos?
user2005
2014-06-23 03:47:57 UTC
view on stackexchange narkive permalink

He notado que, incluso después de eliminar los símbolos de mi ejecutable, los nombres de las clases y sus métodos todavía se incluyen al final del archivo ejecutable.

Por ejemplo:

  #include <iostream>using namespace std; class Clingons {public: void clingForever () {cout << "Qapla" << endl; }}; int main (int argc, char * argv []) {Clingons se aferran; cling.clingForever (); return 0;}  

Luego compile y vincule con:

  g ++ cling.cpp -o cling  

Ahora , cuando miro la parte inferior del archivo "cling" resultante con un editor hexadecimal, puedo ver el nombre de la clase "Clingons" junto con sus métodos. También puedo ver esta información mientras depuro ..

incluso después de quitarlos:

  strip -x cling  

Puedo todavía veo la misma información.

Entonces, ¿por qué no se eliminó esta información cuando usé el comando anterior? ¿Hay alguna forma de eliminar (o alterar) esta información de forma que no sea a mano?

La versión utilizada de GCC es i686-apple-darwin10-llvm-g ++ - 4.2 (GCC) 4.2.1

Este es solo un caso de ejemplo. Mi proyecto real involucra el marco Qt.

Tres respuestas:
w s
2014-06-23 10:51:19 UTC
view on stackexchange narkive permalink

Es posible que estés usando RTTI. Intenta compilar tu código con la opción -fno-rtti.

Actualización: Realmente es RTTI.

No sé exactamente cómo funciona, pero logré eliminar esas cadenas de la siguiente manera:

  $ g ++ -Xlinker -unexported_symbol -Xlinker "*" -o archivo ejecutable.cpp $ strip ejecutable  

(Esto se encontró en https://stackoverflow.com/questions/1931626/how-to-really-strip-a-binary- in-macos)

Sin embargo, tenga en cuenta que hay casos extremos en los que RTTI puede ser * requerido * en tiempo de ejecución.
Sé sobre este (comenté la respuesta aceptada) pero no parece eliminar todo de mi proyecto actual de Qt.
@Access Denied: RTTI está deshabilitado de forma predeterminada en las bibliotecas de Qt, por lo que no creo que deshabilitarlo cause un problema. Intenté deshabilitarlo a través de -fno-rtti y no hizo nada.
Tras una inspección más profunda, me doy cuenta de que esta solución funciona. Mantiene referencias a clases y funciones en bibliotecas externas pero nada de mi propio código.
lornix
2014-06-23 07:21:49 UTC
view on stackexchange narkive permalink

Intente compilar su programa como un ensamblado estático y elimínelo usando el compilador. No encontrará ninguna referencia 'adherente' en el ejecutable resultante.

  $ g ++ -static -s cling.cpp -o cling $ ls -l cling * -rwxr-x --- 1 lornix lornix 1,313,792 22 de junio 19:19 cling * -rw-r ----- 1 lornix lornix 222 22 de junio 19:16 cling.cpp $ strings -a cling | grep -ic cling0  
Probé tu sugerencia pero no se compilaba: no puedo ubicar el archivo para: -lcrt0.o ... Además, mi proyecto real está usando el marco Qt, por lo que no puedo construir estático a menos que compre una licencia comercial.
perror
2014-06-23 15:59:12 UTC
view on stackexchange narkive permalink

La caja de herramientas ELFKicker tiene una utilidad llamada sstrip que elimina un ejecutable ELF hasta los huesos.

Pero, parece que estás usando Formato ejecutable Mach-O. Por lo tanto, recomendaría mirar el código fuente de sstrip y crear su propio stripper.

También puede echar un vistazo al código fuente del comando strip para Mach-O y obtener inspiración. Y, también, esta secuencia de comandos Python strip_save_dsym también puede dar algunas pistas.

Finalmente, aquí hay algunas comparaciones entre los formatos ELF y Mach-O:

Aunque tu respuesta no proporciona una solución instantánea, es atrevida y me gusta mucho. Estudiar sstrip parece divertido y tal vez termine creando mi propia herramienta especial para el trabajo.
Gracias, pero también estoy totalmente de acuerdo con su elección de marcar la respuesta WS como la respuesta. La mía es, a lo sumo, alguna información complementaria sobre el tema.


Esta pregunta y respuesta fue traducida automáticamente del idioma inglés.El contenido original está disponible en stackexchange, a quien agradecemos la licencia cc by-sa 3.0 bajo la que se distribuye.
Loading...