2009-10-21 15 views
13

Sto scrivendo una libreria statica riutilizzabile per iPhone, seguendo le istruzioni fornite here.Non esporre i simboli di una libreria utilizzata nella propria libreria statica

Voglio usare minizip nella mia libreria internamente, ma non voglio esporlo all'utente.

Dovrebbe essere possibile per l'utente includere minizip stessi, possibilmente una versione diversa, e non causare conflitti con la mia versione "interna" minizip.

È possibile?

Edit:

Ho provato ad aggiungere -fvisibility=hidden alle bandiere aggiuntive del compilatore per i file MINIZIP e le funzioni di modifica per essere __private_extern__ e __attribute__((visibility("hidden"))), ma sembra ancora a produrre definiti simboli esterni:

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

Modifica # 2:

A quanto pare i simboli contrassegnati con questi le notazioni sono rese private dal linker, che non avviene mai quando Xcode crea i sorgenti, poiché aggiunge il parametro -c ("Compila o assembla i file sorgente, ma non link.")

+0

Sei in grado/vuoi modificare la tua copia interna di minizip, e l'iPhone supporta lo spazio dei nomi a due livelli di Mach-O? Mi aspetto che la risposta ad entrambi dovrebbe essere sì. – ephemient

+0

Sono disposto a modificare la mia copia, certo. Forse potrei avere tutti i simboli preceduti dal prefisso che uso per la mia libreria, in qualche modo?Non mi dispiacerebbe fare my_ . Non so se gli spazi dei nomi a due livelli sono supportati su iPhone. –

+1

Solo per i futuri Googler, potresti voler vedere questo, potrebbe essere utile: http://stackoverflow.com/a/14863432/311567 – dashesy

risposta

-1

Ti consigliamo di dare un'occhiata a Dynamic Library Programming Topics, in particolare la sezione Symbol Exporting Strategies e l'opzione gcc -exported_symbols_listFILE.

+1

Non è il problema con quelli che stanno discutendo le librerie dinamiche (librerie condivise) piuttosto di librerie statiche? L'OP –

+0

si occupa di librerie statiche in cui non vengono applicate le strategie di esportazione dei simboli di caso –

10

È possibile rinominare tutti i simboli esportati da minizip con objcopy.

qualcosa come

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

e minizip.syms

_unzOpen  _yourownprefix_unzOpen 
_unzOpen2 _yourownprefix_unzOpen2 
...   ... 

nessuno scontro se un eseguibile è collegato con un altro minizip.a e yourstaticlibray.a, e perché è stato rinominato tutto il simbolo nel yourstaticlibray.a la chiamata all'interno yourstaticlibray.a a minizip utilizzerà il simbolo prefissato e non quello unzOpen.

+0

objdump non sembra essere disponibile su Mac OS X:/ –

+0

Inoltre non è 'objdump' ma' objcopy' ... Corro la mia risposta. – Nimlar

+0

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

4

Poiché la libreria statica non è altro che un insieme di file .o (che non sono ancora collegati, come hai menzionato), l'unico modo per nascondere completamente la presenza di minizip dal mondo esterno è in qualche modo compilare minizip e il tuo libreria insieme come una singola unità di compilazione e rendere statiche le funzioni/variabili minizip.

Si potrebbe dare un'occhiata a come SQLite esegue il processo di "amalgamazione" che trasforma il codice sorgente della libreria in un unico file .c per un'ulteriore compilazione: The SQLite Amalgamation.

Come bonus otterrete una migliore ottimizzazione (GCC e Binutils molto recenti sono in grado di effettuare ottimizzazioni link-time, ma questa funzionalità non è ancora stata rilasciata).

+0

Sei sulla strada giusta, ma non devi passare attraverso il dolore di fondersi in una singola unità di compilazione, dal momento che il linker strumenti Xcode può fare un "prelink oggetto singolo" "per ottenere lo stesso risultato dopo la compilazione e l'archiviazione. Vedi http://stackoverflow.com/a/18949281/316487. – bleater

Problemi correlati