summaryrefslogtreecommitdiff
path: root/rts
diff options
context:
space:
mode:
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>2007-09-05 05:22:13 +0000
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>2007-09-05 05:22:13 +0000
commit6f69004ae9aa595ad439771fa41b0feeb118810b (patch)
treee55fe78fd6209768f6edd14e2b4ce48a2408a9da /rts
parentc4b993f3433777eb070de3090d76754cd6b4e2ec (diff)
downloadhaskell-6f69004ae9aa595ad439771fa41b0feeb118810b.tar.gz
Use dlsym on OS X if available
On OS X 10.4 and newer, we have to use dlsym because the old NS* interface has been deprecated. The patch checks for HAVE_DLFCN_H instead of switching on the OS version. There is one additional quirk: although OS X prefixes global symbols with an underscore, dlsym expects its argument NOT to have a leading underscore. As a hack, we simply strip it off in lookupSymbol. Something a bit more elaborate might be cleaner.
Diffstat (limited to 'rts')
-rw-r--r--rts/Linker.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/rts/Linker.c b/rts/Linker.c
index c212c0fef2..7c6d7448ad 100644
--- a/rts/Linker.c
+++ b/rts/Linker.c
@@ -83,7 +83,9 @@
# include <mach-o/loader.h>
# include <mach-o/nlist.h>
# include <mach-o/reloc.h>
+#if !defined(HAVE_DLFCN_H)
# include <mach-o/dyld.h>
+#endif
#if defined(powerpc_HOST_ARCH)
# include <mach-o/ppc/reloc.h>
#endif
@@ -1068,12 +1070,25 @@ lookupSymbol( char *lbl )
return dlsym(dl_prog_handle, lbl);
# endif
# elif defined(OBJFORMAT_MACHO)
+# if HAVE_DLFCN_H
+ /* On OS X 10.3 and later, we use dlsym instead of the old legacy
+ interface.
+
+ HACK: On OS X, global symbols are prefixed with an underscore.
+ However, dlsym wants us to omit the leading underscore from the
+ symbol name. For now, we simply strip it off here (and ONLY
+ here).
+ */
+ ASSERT(lbl[0] == '_');
+ return dlsym(dl_prog_handle, lbl+1);
+# else
if(NSIsSymbolNameDefined(lbl)) {
NSSymbol symbol = NSLookupAndBindSymbol(lbl);
return NSAddressOfSymbol(symbol);
} else {
return NULL;
}
+# endif /* HAVE_DLFCN_H */
# elif defined(OBJFORMAT_PEi386)
OpenedDLL* o_dll;
void* sym;