2012-01-09 15 views
5

Aquí está el problema:En GCC, ¿cómo puedo exportar todos los símbolos de typeinfo para una biblioteca compartida sin exportar todos los símbolos?

Tengo una biblioteca compartida que oculta símbolos por defecto. En realidad, usa la opción -Xlinker --version-script = para exportar algunos símbolos en un archivo específico pero esconder todo el resto. El problema es que si tratamos de capturar las excepciones que se definieron en otras bibliotecas compartidas, obtenemos problemas porque la biblioteca compartida oculta este tipo de información. No puedo hacer explícitamente visibles las clases de excepción porque están definidas en una biblioteca de código abierto que está fuera de mi control. Tampoco quiero enumerar explícitamente los nombres destrozados para typeinfo de las clases de excepción en el archivo de símbolos de script de versión porque hay muchos desarrolladores trabajando en esta biblioteca y se olvidan de hacer esto para alguna clase de excepción en el futuro.

He intentado utilizar #pragma GCC visibilidad push (predeterminado) antes de los archivos .hpp de código abierto, pero no parecía funcionar, los símbolos no eran visibles.

También he intentado usar -fvisibility-ms-compat que exportó los símbolos typeinfo pero también exporté toneladas de otros símbolos que no quería exportar. La biblioteca tiene código C y C++, por lo que no estoy seguro de cómo se supone que funciona con esta opción que es solo para C++.

Lo que realmente necesito es una opción que haga visibles todos los símbolos de typeinfo, dejando otros símbolos ocultos (a menos que sean explícitamente visibles). ¿Hay una opción como esta?

+0

Quizás genere un script de enlazador dinámicamente procesando la salida de ' nm' o algo así? Solo una suposición. –

+0

Esa podría ser una buena forma de hacerlo. Lo había pensado y, aunque no me gusta el trabajo de scripting adicional, podría ser la mejor respuesta. ¡Gracias por tu sugerencia! –

Respuesta

2

La respuesta más directa a su pregunta es probar la opción ld --dynamic-list-cpp-typeinfo. No he tenido la mejor de las suertes con esa opción, pero sí con YMMV.

No dice qué plataforma está utilizando. Ostensiblemente estás usando mingw, ya que has intentado -fvisibility-ms-compat; pero en la remota posibilidad de que estés realmente en un objetivo ELF como Linux, intenta exportar los comodines de los símbolos _ZTI* y _ZTN* desde tu script de versión. (Probablemente pueda hacer algo similar en Windows, pero en la medida en que el mapeo de nombres de Visual C++ no esté realmente documentado, no conozco ningún comodín enlatado que pueda usar).

Cuestiones relacionadas