From: sewardj Date: Tue, 13 Feb 2001 13:11:07 +0000 (+0000) Subject: [project @ 2001-02-13 13:11:07 by sewardj] X-Git-Tag: Approximately_9120_patches~2652 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=19257c4991f3cd05e98683b4e6dadcfb33317a80;p=ghc-hetmet.git [project @ 2001-02-13 13:11:07 by sewardj] Add more general support for linking .so's into the running image. --- diff --git a/ghc/rts/Linker.c b/ghc/rts/Linker.c index 0628423..5316f46 100644 --- a/ghc/rts/Linker.c +++ b/ghc/rts/Linker.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Linker.c,v 1.26 2001/02/12 16:40:34 sewardj Exp $ + * $Id: Linker.c,v 1.27 2001/02/13 13:11:07 sewardj Exp $ * * (c) The GHC Team, 2000 * @@ -47,6 +47,35 @@ static int ocGetNames_PEi386 ( ObjectCode* oc ); static int ocResolve_PEi386 ( ObjectCode* oc ); #endif +int ocAddDLL ( char* dll_name ); + + +/* ----------------------------------------------------------------------------- + * Add a DLL from which symbols may be found. In the ELF case, just + * do RTLD_GLOBAL-style add, so no further messing around needs to + * happen in order that symbols in the loaded .so are findable -- + * lookupSymbol() will subsequently see them by dlsym on the program's + * dl-handle. Returns 0 if fail, 1 if success. + */ +int ocAddDLL ( char* dll_name ) +{ +# if defined(OBJFORMAT_ELF) + void* hdl; + char buf[100]; + if (strlen(dll_name) > 50) + barf("ocAddDLL: excessively long .so/.DLL name `%s'", dll_name); + sprintf(buf, "lib%s.so", dll_name); + hdl = dlopen(buf, RTLD_NOW | RTLD_GLOBAL); + return (hdl == NULL) ? 0 : 1; +# elif defined(OBJFORMAT_PEi386) + barf("ocAddDLL: not implemented on PEi386 yet"); + return 0; +# else + barf("ocAddDLL: not implemented on this platform"); +# endif +} + + /* ----------------------------------------------------------------------------- * Built-in symbols from the RTS */