2014-05-09 6 views
6

Vorrei distribuire un .dylib su OSX, che è stato creato con Delphi. Questo .dylib dovrebbe essere caricabile da applicazioni di terze parti.Distribuzione affidabile di Dylib generato da Delphi su OSX

Questa sembra una domanda doppia, ma dopo molte ricerche, non riesco a trovare una risposta. E 'lo stesso problema come questo: https://forums.embarcadero.com/thread.jspa?messageID=592417

Il problema è che il .dylib richiede libcgunwind.1.0.dylib, ma che non riesce a trovare lo quando viene eseguito da un'applicazione di terze parti. Come prova, ho provato a copiare libcgunwind.1.0.dylib in usr/lib e questo ha funzionato. Quando OSX non riesce a individuare il .dylib, cercherà sempre in usr/lib. Sfortunatamente, non voglio farlo come soluzione finale, perché richiederebbe autorizzazioni elevate e sembra un modo pesante per affrontare un problema semplice.


Ispezione un po 'più da vicino, ho usato otool di ispezionare la mia .dylib, e mi ha dato il seguente percorso: @rpath/libcgunwind.1.0.dylib.

Il problema è che non è possibile stabilire quali percorsi verranno elencati in @rpath, quando il tuo .dylib viene eseguito da un'applicazione di terze parti. Perché ciò funzioni, l'applicazione dovrebbe sempre fornire un percorso assoluto a libcgunwind.1.0.dylib.

La soluzione ovvia è utilizzare install_name_tool per sostituire @rpath con @loader_path. Se la mia logica è corretta, questo dovrebbe far sì che il mio .dylib trovi sempre libcgunwind.1.0.dylib, purché si trovino nella stessa cartella. Questo ha senso, dal momento che il .dylib dovrebbe essere incaricato di trovare le proprie dipendenze.

Così, ho provato la seguente riga di comando:

install_name_tool -change @rpath/libcgunwind.1.0.dylib @loader_path/libcgunwind.1.0.dylib libTest.dylib

e ha ricevuto questo messaggio:

install_name_tool: file not in an order that can be processed (local relocation entries out of place): libTest.dylib

Ho fatto qualche ricerca in giro per questo messaggio di errore, e mi rifugio' Sono stato in grado di trovare qualsiasi informazione su di esso. Devo supporre che lo install_name_tool si aspetti alcune convenzioni specifiche trovate in gcc o llvm .dylib, e che il compilatore di Delphi non stia fornendo tali convenzioni.

Ho fatto un po 'di ricerche nel compilatore di Delphi dccosx e ho controllato gli argomenti della riga di comando che Delphi sta inviando, ma non riesco a trovare nessuna opzione utile. Questo modo di utilizzare libcgunwind.1.0.dylib sembra essere implicito nel compilatore e non qualcosa che posso regolare.

Non sto suggerendo che questo sia il modo giusto per affrontare il problema, queste sono solo le ultime cose che ho provato. Se riesci a trovare un modo diverso di risolvere il problema, condividi le tue idee!

risposta

3

Il file_installazione_tool sembra richiedere che alcune parti del dylib siano in un determinato ordine come "voci di rilocazione locali", quindi "tabella simboli", "simboli locali", ... Il messaggio di errore indica che questo ordine non è così previsto.

Il mio suggerimento è di provare a correggere il file dylib. Lo faccio sempre con gli eseguibili OSX perché ho bisogno di dire loro quali versioni di dylib sono compatibili con.Questo risolve un paio di bug in un'applicazione Delphi OSX. Un dylib ha una struttura molto simile all'eseguibile. La mia esperienza è che applicare patch a questi file non è così complicato come sembra.

È possibile trovare la descrizione della struttura del file qui: https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/MachORuntime/Reference/reference.html

La sezione LC_LOAD_DYLIB è quello che avrete bisogno di guardare. Dovresti essere in grado di sostituire i nomi di dylib con qualcosa di più lungo in quanto questa sezione di solito ha qualche padding extra.

+0

Soluzione interessante. Terrò la taglia in caso qualcuno tiri fuori qualcosa di meno coinvolto, ma temo che questa potrebbe essere l'unica soluzione là fuori. Suppongo che non sarebbe così male, se potessi trovare un modo per automatizzarlo nel processo di distribuzione. – AudioGL

+0

Bene, ho provato la patch e questo ha funzionato. Sto ancora in balia al pensiero di farlo ripetutamente. Qual è il tuo processo per la distribuzione di un'applicazione? Realizzi strumenti per il patching? – AudioGL

+0

Ho un evento post build nei miei progetti OSX: '" D: \ Dev \ OSXPatcher.exe "" $ (OUTPUTPATH) "'. Quindi il patching avviene automaticamente. –

Problemi correlati