I'm kind of confused about frameworks on iOS. I think they are basically a directory containing a dynamic library, headers and resources.
But in my device the frameworks directories in System/Library/Frameworks don't contain the dynamic library. How is this possible? Shouldn't it be present to be loaded in memory when the application requiring it is launched?
The binaries no longer exist on-device (and have not since iOS 3.1): Apple has merged them all into one large mmap()
'ed cache file, to make app launch a bit more efficient. As the pages usually never change, the kernel can effectively share them between every running image. You can still use dlopen()
on files held within the cache, as dyld
short-circuits file lookup when the given library exists in the cache.
The cache file is in /System/Library/Caches/com.apple.dyld
, and is named after the architecture (armv6
or armv7
). The libraries within can be extracted using dsc_extractor or KennyTM's dyld_decache, available in this repository, but once extracted they can't actually be loaded into memory properly (as they all effectively get their symbol tables merged in the cache.)
There's a bit of a better (though older and less informed, more in-depth) write-up here: http://blog.howett.net/2009/09/cache-or-check/.
I've noticed this, too. Strange. I can't explain to you "where they are", but I have observed, for example:
If I list out a (private) framework directory:
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
You don't see a BluetoothManager.framework/BluetoothManager
dylib file. However, this code does actually work to dynamically open that framework, as if that file exists:
handle = dlopen("/System/Library/PrivateFrameworks/BluetoothManager.framework/BluetoothManager", RTLD_LAZY);
Using the find
command from the root filesystem ("/") location also finds no file on the device named BluetoothManager.
I know that's probably not the answer you're looking for, but depending on why you want to know, maybe it helps?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With