Estoy tratando de averiguar si puedo compilar una biblioteca estática que oculte todos sus objetos y funciones internas, etc., excepto las interfaces que deseo exportar. Estoy experimentando con Xcode (gcc 4.2).Ocultación de símbolos en bibliotecas estáticas compiladas con Xcode/gcc
He utilizado el atributo __attribute__((visibility("hidden")))
en algunas clases de C++ por this documentation. También definí pequeñas funciones de C auxiliares como locales de archivo (estáticas), etc.
Sin embargo, cuando ejecuto strings
en el archivo de biblioteca .a resultante, incluso cuando se compila en la configuración de Release, aún veo los nombres de mis clases ostensiblemente ocultas, con sus nombres de métodos, e incluso los nombres de las funciones locales de archivos esparcidos por allí también.
He añadido -fvisibility=hidden
e incluso -fno-rtti
a las banderas gcc. Si bien esto reduce algunas de las cadenas, los nombres de las clases, los nombres de los métodos y los nombres de las funciones estáticas siguen estando ahí en forma simple o mutilada, pero legible.
¿Hay alguna manera confiable de hacer que el compilador construya esto sin tener los nombres de las cadenas de todo el material interno emitido en el binario? No debería ser necesario tenerlo para ningún cliente externo que se vincule.
(Para aclarar: estoy preguntando acerca de la ofuscación de nomenclatura interna, frente a las necesidades de enlace de exportación literales. Estoy desconcertado de que todo el funcionamiento interno sea visible a través del comando strings
, independientemente de si estos símbolos se exportan formalmente o no).
Gracias.
Si RTTI está activado, todos los nombres de las clases van a ser incorporados sin importar que, con el fin de hacer 'type_info :: nombre)' trabajo (. Puedes intentar recompilar con '-fno-rtti' y ver si hace la diferencia. Por supuesto, si está utilizando 'dynamic_cast' en cualquier lugar, esto no funcionará. – Thomas
Gracias por la pista. Intenté esto, pero todos los nombres todavía están allí en forma destrozada. –
Realmente debería pensar en volver a adjudicar la respuesta, ya que la de Bleater no requiere ningún engaño. No solo eliminó la mayoría de mis nombres, sino que redujo en gran medida el tamaño de la biblioteca que necesito compartir. –