2011-11-18 9 views
10

Su Mac OS X, gli eseguibili binari nel formato DYLD contengono "comandi del caricatore" che istruiscono il sistema di caricamento della libreria su come gestire il contenuto del file. In particolare, il comando loader istruisce il sistema in cui cercare le librerie dipendenti, ecc.Come posso installare un comando DYLD loader che non sia esplicitamente supportato da ld?

È possibile visualizzare l'elenco completo dei comandi del caricatore per qualsiasi file binario sul sistema eseguendo "otool -l/percorso/a/la propria/app".

In generale questi comandi del caricatore sono impostati dallo strumento "ld" durante la fase di collegamento della compilazione di un progetto.

La mia domanda è, cosa devo fare per aggiungere comandi di caricamento per tipi pubblicizzati che non sono supportati (apparentemente) da ld?

In particolare, vorrei sfruttare il comando del caricatore LC_DYLD_ENVIRONMENT, che può essere utilizzato per specificare una stringa nella tabella dei comandi del caricatore di un binario che deve essere caricata e valutata come impostazioni delle variabili d'ambiente nel contesto del eseguibile.

Non vedo alcun argomento in grado di facilitare questo. Qualcosa come "-sectcreate", ma per aggiungere specificamente al contenuto dei comandi del caricatore, è quello che sto cercando.

So che questo è possibile perché almeno un'applicazione standard su Mac OS X lo utilizza: Safari. Ma non so se ottengono questo risultato con una sorta di massaggio post-link del binario, se stanno usando una versione personalizzata di ld che sa come creare e concatenare il comando del caricatore personalizzato, o se stanno sfruttando una funzione di general-purpopse del comando ld che non sono stato in grado di capire.

risposta

14

Sembra che si possa usare -dyld_env, in questo modo: "-dyld_env DYLD_FRAMEWORK_PATH = /". Questo non è documentato nella pagina man, ma può essere trovato in Options.cpp di ld64 e menzionato nel file Changelog. Se stai provando a farlo da Xcode, probabilmente dovrai farlo in questo modo: "-Xlinker -dyld_env -Xlinker DYLD_FRAMEWORK_PATH = /".

Una cosa da notare: se si guarda dyld.cpp di dyld, si vedrà che consente solo le variabili di ambiente che iniziano con DYLD_ e terminano con _PATH.

+0

Ottimo! Grazie. Ho anche ricevuto un feedback tramite Twitter che si è premurato di sottolineare che LC_DYLD_ENVIRONMENT non consente effettivamente di definire variabili di ambiente arbitrarie, solo quelle che influiscono sul caricamento DYLD. Quindi, in tal senso, la raccomandazione LSEnvironment di Ned di seguito è più adatta alle mie esigenze immediate, ma la tua risposta è il riferimento più appropriato per la sostanza della domanda. – danielpunkass

8

Se il file eseguibile è strutturato come parte di un pacchetto di applicazioni OS X standard (ad esempio un file .app che può essere avviato da un utente), il metodo convenzionale per specificare variabili di ambiente specifiche dell'applicazione è tramite il suo file plist utilizzando la chiave LSEnvironment . Vedere here per ulteriori informazioni.

+0

Grazie, Ned! Questa non è una risposta canonica per la domanda come posta, ma anzi tocca al cuore del mio attuale interesse per la funzione di comando del caricatore DYLD. Userò LSEnvironment per gli scopi descritti! – danielpunkass