Port better to FreeBSD’s dlfunc vs dlsym

This avoids warnings when converting between void * and
function pointers, which strict C11 does not allow.
* configure.ac (dlfunc): Check for existence.
* src/dynlib.c (dlfunc) [!HAVE_DLFUNC]: New macro.
(dynlib_func): New function.
* src/dynlib.h (dynlib_function_ptr, dynlib_func): New decls.
* src/emacs-module.c (Fmodule_load): Use dynlib_func, not
dynlib_sym, for function pointers.
This commit is contained in:
Paul Eggert 2015-11-23 18:48:42 -08:00
parent ceaca7bec6
commit da8c7ca264
4 changed files with 20 additions and 2 deletions

View file

@ -3316,6 +3316,11 @@ if test "${with_modules}" != "no"; then
if test "${HAVE_MODULES}" = no; then
AC_MSG_ERROR([Dynamic modules are not supported on your system])
else
SAVE_LIBS=$LIBS
LIBS="$LIBS $LIBMODULES"
AC_CHECK_FUNCS([dlfunc])
LIBS=$SAVE_LIBS
fi
fi

View file

@ -206,3 +206,13 @@ dynlib_close (dynlib_handle_ptr h)
#error "No dynamic loading for this system"
#endif
#if !HAVE_DLFUNC
# define dlfunc dynlib_sym
#endif
dynlib_function_ptr
dynlib_func (dynlib_handle_ptr h, const char *sym)
{
return (dynlib_function_ptr) dlfunc (h, sym);
}

View file

@ -25,6 +25,8 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
typedef void *dynlib_handle_ptr;
dynlib_handle_ptr dynlib_open (const char *path);
void *dynlib_sym (dynlib_handle_ptr h, const char *sym);
typedef struct dynlib_function_ptr_nonce *(*dynlib_function_ptr) (void);
dynlib_function_ptr dynlib_func (dynlib_handle_ptr h, const char *sym);
bool dynlib_addr (void *ptr, const char **path, const char **sym);
const char *dynlib_error (void);
int dynlib_close (dynlib_handle_ptr h);

View file

@ -710,7 +710,7 @@ DEFUN ("module-load", Fmodule_load, Smodule_load, 1, 1, 0,
if (!gpl_sym)
error ("Module %s is not GPL compatible", SDATA (file));
module_init = (emacs_init_function) dynlib_sym (handle, "emacs_module_init");
module_init = (emacs_init_function) dynlib_func (handle, "emacs_module_init");
if (!module_init)
error ("Module %s does not have an init function.", SDATA (file));
@ -937,7 +937,8 @@ allocate_emacs_value (emacs_env *env, struct emacs_value_storage *storage,
/* Mark all objects allocated from local environments so that they
don't get garbage-collected. */
void mark_modules (void)
void
mark_modules (void)
{
for (Lisp_Object tem = Vmodule_environments; CONSP (tem); tem = XCDR (tem))
{