2009-12-19 8 views
7

MacOS 10.6, si tengo un archivo "unwanted.c", que contiene:Cómo pelar realmente un binario en MacOs

class secret_thing { 
public: 
secret_thing() {} 
void revealing_method_name() {} 
}; 

main() 
{ 
    secret_thing obj; 
    obj.revealing_method_name(); 
} 

Ahora hago:

$ g++ unwanted.c -o unwanted 
$ strip unwanted 
$ nm unwanted | grep secret 
0000000100000eb8 T __ZN12secret_thing21revealing_method_nameEv 
0000000100000eae T __ZN12secret_thingC1Ev 

Si Me dividir el interfaz e implementación de la clase secreta, como la mayoría de las personas lo hacen cuando escriben código C++, entonces no hay símbolos no deseados en el ejecutable eliminado. Lamentablemente, me entregó una base de código existente de muchos miles de líneas de código y esta no es una de mis opciones.

He intentado -fno-rtti, como una suposición salvaje, y eso no solucionó nada. He rezado a los dioses de Google y he encontrado muchas referencias a clubes de striptease, pero no enlaces útiles. He robado las páginas man para strip, g ++ y ld en el mac, y no había cosas obvias para probar, aunque la frase "private externs" era intrigante, no pude entender qué hacer al respecto.

[update] Lamentablemente, hay un problema con mi intento de dar un pequeño ejemplo. Aquí hay un ejemplo más complicado, que está más cerca de lo que es el problema real, que todavía tiene símbolos no deseados si está optimizado.

Pido disculpas por los malos ejemplos. Resulta difícil encontrar el problema real más pequeño. Muchas gracias por las respuestas, sin embargo, cada respuesta me acerca a una solución.

class base { 
public: 
    virtual int revealing_method_name() = 0; 
    virtual ~base() {}; 
}; 

class secret_thing : public base { 
public: 
    int revealing_method_name() { return 0; }; 
}; 

class other_thing : public base { 
public: 
    int revealing_method_name() { return 1; }; 
}; 

int main(int argc, char**) 
{ 
    base *object = 0; 
    if(argc > 1) object = new secret_thing; 
    else object = new other_thing; 

    return object->revealing_method_name(); 
} 

Respuesta

8

mediante la siguiente línea de compilación me tira con éxito los símbolos desde el ejecutable:

$ g++ -Xlinker -unexported_symbol -Xlinker "*" -o executable file.cpp 
$ strip executable 

Dado el archivo de ejemplo más reciente, este resultados en:

$ nm executable 
       U __ZTVN10__cxxabiv117__class_type_infoE 
       U __ZTVN10__cxxabiv120__si_class_type_infoE 
       U __ZdlPv 
       U __Znwm 
       U ___cxa_pure_virtual 
       U ___gxx_personality_v0 
0000000100000000 A __mh_execute_header 
       U _exit 
       U dyld_stub_binder 
1

Esto parece funcionar como se desea ...:

$ strip unwanted 
$ nm unwanted | grep secret | cut -f 3 -d ' ' > /tmp/remove 
$ strip -R /tmp/remove unwanted 
+0

Me han enviado el código incorrecto. Con el código de ejemplo correcto, como ahora se lee la pregunta, con la implementación de los métodos DENTRO de la definición de clase, la tira dice: tira: símbolos a los que se hace referencia mediante entradas indirectas de la tabla de símbolos que no se pueden eliminar:/Users/michael. juguete/no deseado __ZN12secret_thing21revealing_method_nameEv __ZN12secret_thingC1Ev – mtoy

+0

Sin embargo, la respuesta fue bastante útil, ya que me dio más forraje de google, esa cadena de error revela algunas áreas de investigación más interesantes. – mtoy

1

Teniendo en cuenta el código de ejemplo que has enviado, añadiendo los resultados de la optimización de la bandera '-o' en esos símbolos no están mostrando nm después de la compilación.

+0

Han publicado un ejemplo más cercano al problema real que todavía presenta el problema. La aplicación original que me llevó a este punto fue construida optimizada. Gracias por la respuesta. – mtoy

2

Parece que lo que realmente quiere es no quitar el ejecutable, sino ofuscar su tabla de símbolos. No estoy seguro, pero tal vez algo como this sería útil. Por lo menos, "la tabla C++ símbolo Ofuscador" es probablemente una mejor cadena de búsqueda Google ..

+0

Realmente quiero que se elimine el ejecutable. Sin embargo, esto probablemente aparezca en el cuaderno bajo el encabezado "soluciones de copia de seguridad que espero que nunca tenga que implementar". Va justo encima de "escribir mi propio procesador de correos que enlaza lo que está desvinculado que necesita esos símbolos y luego quita los símbolos" – mtoy