2012-05-31 10 views
7

Sono un po 'confuso riguardo i framework su iOS. Penso che siano fondamentalmente una directory contenente una libreria dinamica, intestazioni e risorse.Dove si trovano i file binari del framework iOS nel file system?

Ma nel mio dispositivo le directory framework in System/Library/Frameworks non contengono la libreria dinamica. Com'è possibile? Non dovrebbe essere presente per essere caricato in memoria quando viene avviata l'applicazione che lo richiede?

risposta

13

I binari non esistono più sul dispositivo (e non hanno più da iOS 3.1): Apple li ha uniti tutti in un unico grande file di cache mmap(), per rendere l'avvio delle app un po 'più efficiente. Poiché le pagine di solito non cambiano mai, il kernel può effettivamente condividerle tra ogni immagine in esecuzione. È ancora possibile utilizzare dlopen() sui file contenuti nella cache, come dyld ricerca di cortocircuiti quando la libreria fornita esiste nella cache.

Il file di cache è in /System/Library/Caches/com.apple.dyld e prende il nome dall'architettura (armv6 o armv7). Le librerie all'interno possono essere estratti utilizzando dsc_extractor o dyld_decache di KennyTM, disponibili in this repository, ma una volta estratti non possono in realtà essere caricati in memoria correttamente (come tutti ottengono in modo efficace le loro tabelle dei simboli fuse nella cache.)

c'è un po ' di un articolo migliore (anche se più vecchio e meno informato, più approfondito) qui: http://blog.howett.net/2009/09/cache-or-check/.

2

Ho notato anche questo. Strano. Non posso spiegare a voi "dove sono", ma ho osservato, per esempio:

Se Ne elenco un (privato) annuario quadro:

iPhone4:/System/Library/PrivateFrameworks/BluetoothManager.framework root# ls -alt 
total 8 
lrwxr-xr-x 1 root wheel 28 Nov 4 2011 CodeResources -> _CodeSignature/CodeResources 
drwxr-xr-x 3 root wheel 170 Nov 2 2011 ./ 
drwxr-xr-x 2 root wheel 102 Nov 2 2011 _CodeSignature/ 
-rw-r--r-- 1 root wheel 740 Nov 2 2011 Info.plist 
drwxr-xr-x 170 root wheel 5814 Dec 31 2007 ../ 

iPhone4:/System/Library/PrivateFrameworks/BluetoothManager.framework root# ls -alt _CodeSignature/ 
total 0 
drwxr-xr-x 3 root wheel 170 Nov 2 2011 ../ 
drwxr-xr-x 2 root wheel 102 Nov 2 2011 ./ 
-rw-r--r-- 1 root wheel 1222 Nov 2 2011 CodeResources 

non si vede un BluetoothManager.framework/BluetoothManager file dylib. Tuttavia, questo codice non realmente funzionano per aprire dinamicamente tale quadro, come se il file esiste:

handle = dlopen("/System/Library/PrivateFrameworks/BluetoothManager.framework/BluetoothManager", RTLD_LAZY); 

Utilizzando il comando find dal filesystem di root ("/") posizione trova anche alcun file sul dispositivo di nome BluetoothManager.

So che probabilmente non è la risposta che stai cercando, ma a seconda di perché vuoi sapere, forse è d'aiuto?

+0

Come è stato eseguito un comando ls su iPhone4, il telefono è stato jailbroken? – gabbler

+0

@gabbler, sì, questo era un iPhone 4 jailbroken, con accesso ssh abilitato. – Nate

Problemi correlati