2010-05-15 17 views
13

Estoy construyendo una biblioteca compartida en Ubuntu 9.10. Quiero exportar solo un subconjunto de mis funciones de la biblioteca. En la plataforma de Windows, esto se haría usando un archivo de definición de módulo (.def) que contendría una lista de los nombres externos e internos de las funciones exportadas de la biblioteca.¿Existe un archivo .def equivalente en Linux para controlar nombres de funciones exportadas en una biblioteca compartida?

Tengo las siguientes preguntas:

  1. ¿Cómo puedo restringir las funciones exportadas de una biblioteca compartida a los que yo quiero (es decir, un archivo .def equivalente)

  2. El uso de archivos como .def un ejemplo, le puede dar una función de un nombre externo que es diferente de su nombre interno (útil para prevenir y conflictos de nombres también decorar nombres alterados, etc.)

  3. en las ventanas que puedo usar el comando de exportación (IIRC) a ch Eck la lista de funciones y direcciones exportadas, ¿cuál es la forma equivalente de hacer esto en Linux?

Respuesta

10

La forma más común de hacer solamente ciertos símbolos visibles en un objeto compartido en Linux es pasar la -fvisibility=hidden a gcc y luego decorar los símbolos que se van a ser visible con __attribute__((visibility("default"))).

Si está buscando un archivo de exportación como solución, puede consultar la opción del vinculador --retain-symbols-file=FILENAME que puede hacer lo que está buscando.

No conozco una manera fácil de exportar una función con un nombre diferente al nombre de su función, pero probablemente sea posible con un editor de duela. Edit: Creo que puede usar un script de enlazador (eche un vistazo a la página man para ld) para asignar valores a los símbolos en el paso del enlace, dando así un nombre alternativo a una función dada. Tenga en cuenta que nunca he probado esto.

Para ver los símbolos visibles en un objeto compartido, puede usar el comando readelf. readelf -Ds si no recuerdo mal.

+0

En realidad no tiene que decorar con visibilidad definido como predeterminado, ya que es el valor por defecto ... –

+1

@Fredrik Ullner: I no entiendo tu punto Si usa '-fvisibility = hidden', entonces tiene que restablecer la visibilidad a los valores predeterminados de los símbolos que no desea ocultar, de lo contrario, no se mostrarán los símbolos. –

+0

"luego decore los símbolos que desea que sean visibles con __tributo __ ((visibilidad (" predeterminado ")))." No necesita hacer eso, ya que es el predeterminado. –

7

¿Cómo puedo restringir las funciones exportadas de una biblioteca compartida a los que yo quiero (es decir, un archivo .def equivalente)

Tal vez usted está buscando GNU Export Maps o Symbol Versioning

g++ -shared spaceship.cpp -o libspaceship.so.1 -Wl,-soname=libspaceship.so.1 -Wl, --version-script=spaceship.expmap

+0

quizás, el archivo de mapa nos ayude a definir qué símbolos exportar, sin embargo, a diferencia del archivo def en windows, en linux, el enlazador no genera errores si ve una función en un archivo de mapa que no está definido. ¿Hay alguna forma de error si la función no se encuentra similar a Windows? –

4

gcc también admite la sintaxis de VC de __declspec (dllexport). Ver this.

+0

Pero solo al compilar para Windows. – Calmarius

2

Otra opción es utilizar el comando tira con esta forma:

strip --keep-symbol=symbol_to_export1 --keep-symbol=symbol_to_export2 ... \ 
    libtotrip.so -o libout.so 
Cuestiones relacionadas