Re: Loading of Mach-O executable files.
Re: Loading of Mach-O executable files.
- Subject: Re: Loading of Mach-O executable files.
- From: Greg Parker <email@hidden>
- Date: Sat, 30 Jan 2010 03:10:36 -0800
On Jan 29, 2010, at 7:58 AM, Richard Penwell wrote:
> I've been toying around with some problems in the world of dynamic code loading... (a vast and mythical place). I understand that there is a fundamental difference between Mach-O executables and Mach-O dynamic libraries (beyond the obvious Mach-O filetype header). I assume it has to do with a concept I've read about known as Position Independent Code, in that Dynamic Libraries are PIC and executables (assuming that they are the first object to load and therefore could not have to content for a VM address range) are not. The question goes something like this:
>
> Given I have a Mach-O executable file that contains a symbol that I wish to be able to call is there any way to use dlopen or NSBundle load to bring those symbols into another executable?
>
> I have attempted the following two methods:
>
> NSBundle *applicationBundle = [[NSBundle alloc] initWithFile:@"path/to/mach-o/executable"];
> [applicationBundle load]
>
> The above results in:
> 2010-01-29 10:07:41.812 LoadPagesDynamically[93324:a0f] Attempt to load executable of a type that cannot be dynamically loaded for CFBundle 0x1001161b0 <path/to/mach-o/executable> (executable, not loaded)
>
> Also:
>
> void* pages_application = dlopen("path/to/mach-o/executable", RTLD_NOW);
>
> The above results in pages_application == NULL with no errors being reported.
>
> If it is not possible (I suspect not), is it possible to convert executable object code to a PIC representation to be dynamically loaded?
>
> I imagine that there may be something that I don't know given Apple's history of binary magic (fat binaries, rosetta etc).
>
> It seems that this is a dark corner of the DYLD system that isn't well documented as to the technical aspects of why this isn't done.
>
> I've tried to be as detailed as possible, but if you would like more information as to what I've tried, please let me know.
As mentioned earlier, you'll get better answers from email@hidden.
You cannot convert a non-PIC binary to PIC. The compiler and linker will have made optimizations to the non-PIC binary that you can't undo without rebuilding it from scratch.
A typical main executable is also missing the symbol tables that would be needed for other code to link to its symbols.
In theory, you could build a PIC-capable symbol-rich main executable. Then there's no technical restriction against loading it into another process, other than that dyld isn't designed to do that and most executables wouldn't be usable that way anyway.
--
Greg Parker email@hidden Runtime Wrangler
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden