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