2009-10-21 15 views
13

Estoy escribiendo una biblioteca estática reutilizable para el iPhone, siguiendo las instrucciones proporcionadas here.No exponer símbolos de una biblioteca usada en la propia biblioteca estática

Quiero usar minizip en mi biblioteca internamente, pero no quiero exponerlo al usuario.

El usuario debe poder incluir minizip, posiblemente una versión diferente, y no causar conflictos con mi versión "interna" de minizip.

¿Esto es posible?

Editar:

He intentado añadir a -fvisibility=hidden opciones del compilador adicionales para archivos minizip y el cambio de funciones para ser __private_extern__ y __attribute__((visibility("hidden"))), pero todavía parece producir símbolos externos definidos:

00000918 T _unzOpen 
0000058e T _unzOpen2 
00001d06 T _unzOpenCurrentFile 
00001d6b T _unzOpenCurrentFile2 
... 

Editar # 2:

Aparentemente los símbolos marcados con estos el enlazador solo hace las notaciones privadas, lo que nunca sucede cuando Xcode crea las fuentes, ya que agrega el parámetro -c ("Compila o ensambla los archivos fuente, pero no enlaza")

+0

¿Puede o quiere modificar su copia interna de minizip, y el iPhone es compatible con el espacio de nombres de símbolos de dos niveles de Mach-O? Espero que la respuesta a ambos sea sí. – ephemient

+0

Estoy dispuesto a modificar mi copia, claro. Tal vez podría simplemente tener todos los símbolos precedidos con el prefijo que uso para mi biblioteca, de alguna manera?No me importaría hacer my_ . No sé si se admiten espacios de nombres de símbolos de dos niveles en el iPhone. –

+1

Solo para futuras personas de Google, es posible que desee ver esto, podría ser útil: http://stackoverflow.com/a/14863432/311567 – dashesy

Respuesta

-1

Querrás Eche un vistazo a Dynamic Library Programming Topics, específicamente la sección Symbol Exporting Strategies y la opción gcc -exported_symbols_listFILE.

+1

No es el problema con los que están discutiendo bibliotecas dinámicas (bibliotecas compartidas) en lugar que las bibliotecas estáticas? –

+0

OP trata con bibliotecas estáticas en cuyo caso las estrategias de exportación de símbolos no se aplican –

10

Puede cambiar el nombre de todos los símbolos exportados de minizip con objcopy.

algo así como

objcopy -redefine-sym=minizip.syms yourstaticlibray.a 

y minizip.syms

_unzOpen  _yourownprefix_unzOpen 
_unzOpen2 _yourownprefix_unzOpen2 
...   ... 

Sin choque si un ejecutable está vinculado con otro minizip.a y yourstaticlibray.a, y debido a que cambió el nombre de todo el símbolo de yourstaticlibray.a su llamada dentro yourstaticlibray.a a minizip usará el símbolo con prefijo, y no el que está sin abrir.

+0

objdump no parece estar disponible en Mac OS X:/ –

+0

Además, no es 'objdump' sino' objcopy' ... Voy a corregir mi respuesta. – Nimlar

+0

@ JakaJančar $ brew install binutils && gobjdump – FGRibreau

4

Dado que la biblioteca estática no es más que un conjunto de archivos .o (que aún no están vinculados, como ha mencionado), la única forma de ocultar por completo la presencia de minizip del mundo exterior es compilar minizip y su biblioteca juntos como una sola unidad de compilación y hacer que las funciones/variables minizip estén estáticas.

Puede ver cómo hace SQLite el proceso de "amalgamación" que convierte el código fuente de la biblioteca en un solo archivo .c para una mayor compilación: The SQLite Amalgamation.

Como beneficio adicional obtendrás una mejor optimización (realmente recientes GCC y Binutils pueden optimizar el tiempo de enlace, pero esta funcionalidad aún no se ha lanzado).

+0

Está en el camino correcto, pero no tiene que pasar por el dolor de fusionarse en una sola unidad de compilación, ya que el enlazador de herramientas de Xcode puede hacer un prelink de un solo objeto "para lograr el mismo resultado después de la compilación y el archivo. Ver http://stackoverflow.com/a/18949281/316487. – bleater

Cuestiones relacionadas