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();
}
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
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