1#include <mach-o/dyld.h> 2#include <stdio.h> 3 4typedef void (*thrower)(); 5typedef void (*call_thrower)(thrower); 6typedef void (*call_call_thrower)(call_thrower); 7 8int main() 9{ 10 NSObjectFileImage image, image2; 11 NSObjectFileImageReturnCode retCode; 12 NSModule module, module2; 13 NSSymbol sym; 14 call_call_thrower func; 15 call_thrower do_call_thrower; 16 17 retCode = NSCreateObjectFileImageFromFile ("plugin2", &image2); 18 if (retCode != NSObjectFileImageSuccess) 19 { 20 fprintf (stderr, "failed to load plugin2\n"); 21 return 1; 22 } 23 module2 = NSLinkModule(image2, "plugin2", 24 (NSLINKMODULE_OPTION_BINDNOW 25 | NSLINKMODULE_OPTION_PRIVATE)); 26 27 sym = NSLookupSymbolInModule (module2, "_do_call_thrower"); 28 if (sym == NULL) 29 { 30 fprintf (stderr, "couldn't find `do_call_thrower' in plugin2\n"); 31 return 1; 32 } 33 do_call_thrower = (call_thrower) NSAddressOfSymbol (sym); 34 35 retCode = NSCreateObjectFileImageFromFile ("plugin", &image); 36 if (retCode != NSObjectFileImageSuccess) 37 { 38 fprintf (stderr, "failed to load plugin\n"); 39 return 1; 40 } 41 module = NSLinkModule(image, "plugin", 42 (NSLINKMODULE_OPTION_BINDNOW 43 | NSLINKMODULE_OPTION_PRIVATE)); 44 sym = NSLookupSymbolInModule (module, "_func"); 45 if (sym == NULL) 46 { 47 fprintf (stderr, "couldn't find `func' in plugin\n"); 48 return 1; 49 } 50 func = (call_call_thrower) NSAddressOfSymbol (sym); 51 func (do_call_thrower); 52 53 NSDestroyObjectFileImage (image); 54 NSUnLinkModule (module, NSUNLINKMODULE_OPTION_RESET_LAZY_REFERENCES); 55 56 NSDestroyObjectFileImage (image2); 57 NSUnLinkModule (module2, NSUNLINKMODULE_OPTION_RESET_LAZY_REFERENCES); 58 59 return 0; 60} 61