Pregunta

MacOS 10.6, si tengo una "unwanted.c" archivo que contiene:

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

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

Ahora que 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 la interfaz y la implementación de la clase secreta, como la mayoría de la gente hace cuando se escribe código C ++, entonces no hay símbolos no deseados en el ejecutable despojado. Por desgracia, me di una base de código existente de muchos miles de líneas de código y esto no es una de mis opciones.

He tratado -fno-rtti, como una conjetura salvaje, y que no arreglar nada. He rezado a los dioses de Google y ha encontrado muchas referencias para despojar a los clubes, pero no hay enlaces útiles. He desnatada las páginas man de tira, g ++ y ld en el mac, y no había cosas obvias para probar, aunque la frase "los externos privados" era intrigante, no podía entender por qué hacer al respecto.

[Actualización] Lamentablemente, no resulta ser un problema con mi intento de hacer un pequeño ejemplo. Aquí es un ejemplo más complicado, que está más cerca de lo que es el verdadero problema, que todavía tiene símbolos no deseados si se construye optimizado.

Me disculpo 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 empuja cerca de 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();
}
¿Fue útil?

Solución

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

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

Dado el archivo de ejemplo más reciente, esto se traduce 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

Otros consejos

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

Esto parece funcionar tan deseado ...:

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

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 habiéndose representado por nm después de la compilación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top