2010-02-08 5 views
33

Tengo un proyecto de biblioteca compartida que se genera a partir de 4 bibliotecas estáticas (.a) y un archivo de objeto (.o). Estoy intentando agregar la opción -fvisibility=hidden para restringir los símbolos en la salida a solo aquellos que marque en la fuente con un __ atributo.¿Cómo aplicar la opción de gcc -fvisibility a símbolos en bibliotecas estáticas?

He añadido la opción -fvisibility=hidden a las opciones de compilación para el proyecto .so (que cubre el archivo .o) y para los proyectos .a.

Los símbolos en el archivo de objeto se eliminan como se esperaba del final .so. Sin embargo, los símbolos de los proyectos .a están todavía en el archivo final .so. Agregar la opción -fvisibility=hidden al comando de enlace .so no tiene ningún efecto.

¿Qué estoy haciendo mal?

Mi propósito aquí es eliminar del .so todos los símbolos, excepto las funciones de interfaz de la biblioteca.

EDITAR: En realidad usé un version map para resolver esto por ahora. Sin embargo, requiere un mantenimiento continuo del script de versión a medida que cambian los símbolos externos. La respuesta aceptada tiene una mejor idea.

+0

Plataforma no se menciona, pero para una solución de haciendo esto en iOS/OS X ver http://stackoverflow.com/a/18949281/316487 – bleater

Respuesta

24

Básicamente, la visibilidad se maneja durante la vinculación, y el vinculador no parece imponerlo en los archivos estáticos. Se solicitó una pregunta relacionada (aunque no un duplicado) en SO here.

Lo que yo le aconsejo que hacer es reemplazar su etapa de vinculación: gcc -shared -o mylib.so foo.o libbar.a en un proceso de dos etapas en el que vuelvas los ficheros objeto:

  • ar x libbar.a (posiblemente en un directorio adecuado, vacío)
  • gcc -fvisibility=hidden -shared -o mylib.so foo.o tempdir/*.o
+0

Buena idea. Se adapta a lo que aprendí por experimentación. Puede intentar esto más tarde. –

46

simplemente pasan a -Wl,--exclude-libs,ALL gcc

Esto indicará al lin ker para transformar todos los símbolos en las bibliotecas estáticas en ocultos.

--exclude-libs también acepta una lista de archivos (es decir, nombres de bibliotecas estáticas) para una granularidad más precisa de las bibliotecas para ocultar símbolos.

Nota: esto sólo funcionará en sistemas que utilizan GNU binutils (por ejemplo, Linux) o con un engarce de apoyo --exclude-libs (por ejemplo, no va a funcionar con ld64 de OSX)

+1

¡Muchas gracias! Utilizo esto junto con -fvisibility = hidden y exporto selectivamente solo la API pública (IMO solo el enfoque de listas blancas está cuerdo especialmente cuando se trata de bibliotecas estáticas externas al proyecto). Tal vez si puede agregar algunas etiquetas, los futuros miembros de Google estarán agradecidos. – dashesy

+2

Creo que es -Wl, - exclude-libs = ALL (reemplace la segunda coma con an =) –

+0

Desafortunadamente, esto no funciona en Mac OS ya que ld no conoce esta opción en Mac OS. – rsp1984

Cuestiones relacionadas