* Enhanced the dlopen() checks, especially for platforms that do not

need -ldl.
  * Ported the plugin loading code to the HP-UX shl_load() system.


git-svn-id: svn://svn.zoy.org/elk/trunk@129 55e467fa-43c5-0310-a8a2-de718669efc6
This commit is contained in:
sam 2003-09-09 13:30:23 +00:00
parent 9bcdb37dee
commit dcf74a9c38
2 changed files with 86 additions and 19 deletions

View File

@ -155,21 +155,54 @@ fi
# Which mechanism should be used to dynamically load object files?
ac_cv_my_can_load_lib=no
# OS X style
AC_CHECK_HEADERS(mach-o/dyld.h,
[AC_CHECK_FUNCS(NSLinkModule,
[AC_DEFINE(HAVE_DL_DYLD, 1, [Define if you have the Darwin dyld API])
AC_DEFINE(SYMS_BEGIN_WITH, ['_'], [Define if symbols start with '_'])
ac_cv_my_can_load_lib=yes])])
# HP-UX style
if test "${ac_cv_my_can_load_lib}" = "no"; then
AC_CHECK_HEADERS(dl.h)
ac_cv_my_have_shl_load=no
AC_CHECK_FUNC(shl_load,
[ac_cv_my_have_shl_load=yes,
AC_CHECK_LIB(dld, shl_load,
[ac_cv_my_have_shl_load=yes
ELK_LIBS="${ELK_LIBS} -ldld"])])
if test "${ac_cv_my_have_shl_load}" = "yes"; then
AC_DEFINE(HAVE_DL_SHL_LOAD, 1, [Define if you have the shl_load API])
ac_cv_my_can_load_lib=yes
fi
fi
# Whatever style
if test "${ac_cv_my_can_load_lib}" = "no"; then
AC_CHECK_LIB(dld, dld_link,
[ELK_LIBS="${ELK_LIBS} -ldld"
AC_DEFINE(HAVE_DL_DLD_LINK, 1, [Define if you have the GNU dld library])
ac_cv_my_can_load_lib=yes])
fi
AC_CHECK_HEADERS(a.out.h)
# Only test for dlopen() if the others didn't work
if test "${ac_cv_my_can_load_lib}" = "no"; then
AC_CHECK_HEADERS(dlfcn.h,
[AC_CHECK_LIB(dl, dlopen,
[AC_DEFINE(HAVE_DL_DLOPEN, 1, [Define if you have the dlopen API])
ELK_LIBS="${ELK_LIBS} -ldl"
ac_cv_my_can_load_lib=yes])])
AC_CHECK_HEADERS(dlfcn.h sys/dl.h)
ac_cv_my_have_dlopen=no
AC_CHECK_FUNC(dlopen,
ac_cv_my_have_dlopen=yes,
AC_CHECK_LIB(dl, dlopen,
ac_cv_my_have_dlopen=yes
ELK_LIBS="${ELK_LIBS} -ldl",
AC_CHECK_LIB(svld, dlopen,
ac_cv_my_have_dlopen=yes
ELK_LIBS="${ELK_LIBS} -lsvld")))
if test "${ac_cv_my_have_dlopen}" = "yes"; then
AC_DEFINE(HAVE_DL_DLOPEN, 1, [Define if you have the dlopen API])
ac_cv_my_can_load_lib=yes
fi
fi
if test "${ac_cv_my_can_load_lib}" = "yes"; then

View File

@ -32,14 +32,24 @@
#ifdef CAN_LOAD_LIB
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#if defined(HAVE_DL_DYLD)
#if defined(HAVE_MACH_O_DYLD_H)
# include <mach-o/dyld.h>
#elif defined(HAVE_DL_DLOPEN)
# include <dlfcn.h>
# if defined(HAVE_DLFCN_H)
# include <dlfcn.h>
# endif
# if defined(HAVE_SYS_DL_H)
# include <sys/dl.h>
# endif
#elif defined(HAVE_DL_SHL_LOAD)
# if defined(HAVE_DL_H)
# include <dl.h>
# endif
#endif
#include "kernel.h"
@ -58,29 +68,29 @@ void Dlopen_File (char *fn) {
if (Verb_Load)
printf ("[dyld %s]\n", fn);
ret = NSCreateObjectFileImageFromFile(fn, &image);
ret = NSCreateObjectFileImageFromFile (fn, &image);
if (ret != NSObjectFileImageSuccess)
Primitive_Error ("could not map `~%~s'",
Make_String (fn, strlen (fn)));
/* Open the dynamic module */
handle = NSLinkModule(image, fn, NSLINKMODULE_OPTION_RETURN_ON_ERROR);
handle = NSLinkModule (image, fn, NSLINKMODULE_OPTION_RETURN_ON_ERROR);
if (!handle) {
NSLinkEditErrors errors;
const char *file, *errstr;
const char *file, *err;
int errnum;
NSLinkEditError(&errors, &errnum, &file, &errstr);
NSLinkEditError (&errors, &errnum, &file, &err);
Primitive_Error ("could not dyld `~%~s': ~%~s",
Make_String (file, strlen (file)),
Make_String (errstr, strlen (errstr)));
Make_String (err, strlen (err)));
}
/* Destroy our image, we won't need it */
NSDestroyObjectFileImage(image);
NSDestroyObjectFileImage (image);
/* NSUnLinkModule(handle, FALSE); */
/* NSUnLinkModule (handle, FALSE); */
#elif defined(HAVE_DL_DLOPEN)
void *handle;
@ -88,12 +98,32 @@ void Dlopen_File (char *fn) {
if (Verb_Load)
printf ("[dlopen %s]\n", fn);
handle = dlopen (fn, RTLD_NOW|RTLD_GLOBAL);
#if defined(RTLD_GLOBAL)
handle = dlopen (fn, RTLD_NOW | RTLD_GLOBAL);
#elif defined(DL_GLOBAL)
handle = dlopen (fn, DL_NOW | DL_GLOBAL);
#else
handle = dlopen (fn, 0);
#endif
if (handle == NULL) {
char *errstr = dlerror ();
char *err = dlerror ();
Primitive_Error ("dlopen failed: ~%~s",
Make_String (errstr, strlen (errstr)));
Make_String (err, strlen (err)));
}
#elif defined(HAVE_DL_SHL_LOAD)
shl_t handle;
if (Verb_Load)
printf ("[shl_load %s]\n", fn);
handle = shl_load (fn, BIND_IMMEDIATE | BIND_NONFATAL, NULL);
if (handle == NULL) {
char *err = strerror (errno);
Primitive_Error ("shl_load failed: ~%~s",
Make_String (err, strlen (err)));
}
#else
@ -106,15 +136,19 @@ void Dlopen_File (char *fn) {
The_Symbols = Open_File_And_Snarf_Symbols (fn);
for (sp = The_Symbols->first; sp; sp = sp->next) {
#if defined(HAVE_DL_DYLD)
NSSymbol sym = NSLookupSymbolInModule(handle, sp->name);
NSSymbol sym = NSLookupSymbolInModule (handle, sp->name);
if (sym)
sp->value = (unsigned long int)(intptr_t)NSAddressOfSymbol(sym);
sp->value = (unsigned long int)(intptr_t)NSAddressOfSymbol (sym);
#elif defined(HAVE_DL_DLOPEN)
/* dlsym() may fail for symbols not exported by object file;
* this can be safely ignored. */
sp->value = (unsigned long int)(intptr_t)dlsym (handle, sp->name);
#elif defined(HAVE_DL_SHL_LOAD)
void *sym;
shl_findsym (&handle, "share", TYPE_UNDEFINED, &sym);
sp->value = (unsigned long int)(intptr_t)sym;
#endif
}