I have a fork of the JavaScriptCore framework, where I have added a function of my own, which is exported. The framework compiles just find. Running nm
on the framework reveals that the function (JSContextCreateBacktrace_unsafe
) is indeed exported:
Leo-Natans-Wix-MPB:JavaScriptCore.framework lnatan$ nm -gU JavaScriptCore.framework/JavaScriptCore | grep JSContextCreateBacktrace
00000000004cb860 T _JSContextCreateBacktrace
00000000004cba10 T _JSContextCreateBacktrace_unsafe
However, I am unable to obtain the pointer of that function using CFBundleGetFunctionPointerForName
or dlsym
; both return NULL
. At first, I used dlopen
to open my framework, then tried using CFBundleCreate
and then CFBundleGetFunctionPointerForName
but that also returns NULL.
What could cause this?
Update
Something fishy is going on. I renamed one of the JSC functions, and nm
reflects this. However, dlsym
is still able to find the function with the original name, rather than the renamed.
It's hard to track this down since it's highly dependent on your specific environment and circumstances, but it is very likely you're running into this issue because the system image has already been loaded and you haven't changed the name of the framework.
If you look at the source code for
dlopen
in dyld/dyldAPIS.cpp:1458, you'll notice the context passed to dyld is configured withmatchByInstallName = true
. This context is then passed toload
which executes the various stages necessary for image loading. There are a few phases worth noting:loadPhase2
in dyld/dyld.cpp:2896 extracts the ending of the framework path and searches for it in the search pathloadPhase5check
in dyld/dyld:2712 iterates over all loaded images and determines if any of them have a matching install name, and if one does, it returns that instead of loading a new one.loadPhase5load
in dyld/dyld:2601 finally loads the image if it wasn't loaded/found by any earlier steps. (It's worth notingloadPhase5check
is executed first, since image loading is a two pass process.)Given all of the above, I'd try renaming your framework to something besides
JavaScriptCore.framework
. Depending on the install name of both the system framework and your framework, I'd also recommend changing the install name. (There are plenty of blog articles and StackOverflow posts that document how to do this usinginstall_name_tool -id
.)