* 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:
parent
9bcdb37dee
commit
dcf74a9c38
43
configure.ac
43
configure.ac
|
@ -155,21 +155,54 @@ fi
|
||||||
# Which mechanism should be used to dynamically load object files?
|
# Which mechanism should be used to dynamically load object files?
|
||||||
ac_cv_my_can_load_lib=no
|
ac_cv_my_can_load_lib=no
|
||||||
|
|
||||||
|
# OS X style
|
||||||
AC_CHECK_HEADERS(mach-o/dyld.h,
|
AC_CHECK_HEADERS(mach-o/dyld.h,
|
||||||
[AC_CHECK_FUNCS(NSLinkModule,
|
[AC_CHECK_FUNCS(NSLinkModule,
|
||||||
[AC_DEFINE(HAVE_DL_DYLD, 1, [Define if you have the Darwin dyld API])
|
[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_DEFINE(SYMS_BEGIN_WITH, ['_'], [Define if symbols start with '_'])
|
||||||
ac_cv_my_can_load_lib=yes])])
|
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)
|
AC_CHECK_HEADERS(a.out.h)
|
||||||
|
|
||||||
# Only test for dlopen() if the others didn't work
|
# Only test for dlopen() if the others didn't work
|
||||||
if test "${ac_cv_my_can_load_lib}" = "no"; then
|
if test "${ac_cv_my_can_load_lib}" = "no"; then
|
||||||
AC_CHECK_HEADERS(dlfcn.h,
|
AC_CHECK_HEADERS(dlfcn.h sys/dl.h)
|
||||||
[AC_CHECK_LIB(dl, dlopen,
|
ac_cv_my_have_dlopen=no
|
||||||
[AC_DEFINE(HAVE_DL_DLOPEN, 1, [Define if you have the dlopen API])
|
AC_CHECK_FUNC(dlopen,
|
||||||
ELK_LIBS="${ELK_LIBS} -ldl"
|
ac_cv_my_have_dlopen=yes,
|
||||||
ac_cv_my_can_load_lib=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
|
fi
|
||||||
|
|
||||||
if test "${ac_cv_my_can_load_lib}" = "yes"; then
|
if test "${ac_cv_my_can_load_lib}" = "yes"; then
|
||||||
|
|
|
@ -32,14 +32,24 @@
|
||||||
|
|
||||||
#ifdef CAN_LOAD_LIB
|
#ifdef CAN_LOAD_LIB
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#if defined(HAVE_DL_DYLD)
|
#if defined(HAVE_MACH_O_DYLD_H)
|
||||||
# include <mach-o/dyld.h>
|
# include <mach-o/dyld.h>
|
||||||
#elif defined(HAVE_DL_DLOPEN)
|
#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
|
#endif
|
||||||
|
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
|
@ -58,29 +68,29 @@ void Dlopen_File (char *fn) {
|
||||||
if (Verb_Load)
|
if (Verb_Load)
|
||||||
printf ("[dyld %s]\n", fn);
|
printf ("[dyld %s]\n", fn);
|
||||||
|
|
||||||
ret = NSCreateObjectFileImageFromFile(fn, &image);
|
ret = NSCreateObjectFileImageFromFile (fn, &image);
|
||||||
|
|
||||||
if (ret != NSObjectFileImageSuccess)
|
if (ret != NSObjectFileImageSuccess)
|
||||||
Primitive_Error ("could not map `~%~s'",
|
Primitive_Error ("could not map `~%~s'",
|
||||||
Make_String (fn, strlen (fn)));
|
Make_String (fn, strlen (fn)));
|
||||||
|
|
||||||
/* Open the dynamic module */
|
/* Open the dynamic module */
|
||||||
handle = NSLinkModule(image, fn, NSLINKMODULE_OPTION_RETURN_ON_ERROR);
|
handle = NSLinkModule (image, fn, NSLINKMODULE_OPTION_RETURN_ON_ERROR);
|
||||||
|
|
||||||
if (!handle) {
|
if (!handle) {
|
||||||
NSLinkEditErrors errors;
|
NSLinkEditErrors errors;
|
||||||
const char *file, *errstr;
|
const char *file, *err;
|
||||||
int errnum;
|
int errnum;
|
||||||
NSLinkEditError(&errors, &errnum, &file, &errstr);
|
NSLinkEditError (&errors, &errnum, &file, &err);
|
||||||
Primitive_Error ("could not dyld `~%~s': ~%~s",
|
Primitive_Error ("could not dyld `~%~s': ~%~s",
|
||||||
Make_String (file, strlen (file)),
|
Make_String (file, strlen (file)),
|
||||||
Make_String (errstr, strlen (errstr)));
|
Make_String (err, strlen (err)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Destroy our image, we won't need it */
|
/* Destroy our image, we won't need it */
|
||||||
NSDestroyObjectFileImage(image);
|
NSDestroyObjectFileImage (image);
|
||||||
|
|
||||||
/* NSUnLinkModule(handle, FALSE); */
|
/* NSUnLinkModule (handle, FALSE); */
|
||||||
|
|
||||||
#elif defined(HAVE_DL_DLOPEN)
|
#elif defined(HAVE_DL_DLOPEN)
|
||||||
void *handle;
|
void *handle;
|
||||||
|
@ -88,12 +98,32 @@ void Dlopen_File (char *fn) {
|
||||||
if (Verb_Load)
|
if (Verb_Load)
|
||||||
printf ("[dlopen %s]\n", fn);
|
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) {
|
if (handle == NULL) {
|
||||||
char *errstr = dlerror ();
|
char *err = dlerror ();
|
||||||
Primitive_Error ("dlopen failed: ~%~s",
|
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
|
#else
|
||||||
|
@ -106,15 +136,19 @@ void Dlopen_File (char *fn) {
|
||||||
The_Symbols = Open_File_And_Snarf_Symbols (fn);
|
The_Symbols = Open_File_And_Snarf_Symbols (fn);
|
||||||
for (sp = The_Symbols->first; sp; sp = sp->next) {
|
for (sp = The_Symbols->first; sp; sp = sp->next) {
|
||||||
#if defined(HAVE_DL_DYLD)
|
#if defined(HAVE_DL_DYLD)
|
||||||
NSSymbol sym = NSLookupSymbolInModule(handle, sp->name);
|
NSSymbol sym = NSLookupSymbolInModule (handle, sp->name);
|
||||||
if (sym)
|
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)
|
#elif defined(HAVE_DL_DLOPEN)
|
||||||
/* dlsym() may fail for symbols not exported by object file;
|
/* dlsym() may fail for symbols not exported by object file;
|
||||||
* this can be safely ignored. */
|
* this can be safely ignored. */
|
||||||
sp->value = (unsigned long int)(intptr_t)dlsym (handle, sp->name);
|
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
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue