c++ - compilar - gcc compilador
¿Existe un archivo.def equivalente en Linux para controlar los nombres de las funciones exportadas en una biblioteca compartida? (4)
¿Cómo puedo restringir las funciones exportadas de una biblioteca compartida a las que quiero (es decir, un archivo .def equivalente)?
Quizás 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
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.
Tengo las siguientes preguntas:
¿Cómo puedo restringir las funciones exportadas de una biblioteca compartida a las que quiero (es decir, un archivo .def equivalente)?
Usando archivos .def como ejemplo, puede darle a una función un nombre externo que sea diferente de su nombre interno (útil para evitar colisiones de nombres y también para redecorar nombres destrozados, etc.)
En Windows, puedo usar el comando EXPORTAR (IIRC) para verificar la lista de funciones y direcciones exportadas, ¿cuál es la manera equivalente de hacerlo en Linux?
gcc también es compatible con la sintaxis de VC de __declspec (dllexport). Mira esto
La forma más común de hacer visibles ciertos símbolos en un objeto compartido en Linux es pasar la -fvisibility=hidden
a gcc y luego decorar los símbolos que desea que sean visibles con __attribute__((visibility("default")))
.
Si busca una solución de archivo de exportación, puede que quiera mirar 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 del nombre de su función, pero probablemente sea posible con un editor de duendes. Editar: 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 readelf -Ds
.
Otra opción es usar el comando strip de esta manera:
strip --keep-symbol=symbol_to_export1 --keep-symbol=symbol_to_export2 ... /
libtotrip.so -o libout.so