diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2022-09-25 16:15:16 -0400 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2022-09-25 16:15:16 -0400 |
commit | 650c20f1ca4e07591a727e1cfcc74b3363d15985 (patch) | |
tree | 85d11f6437cde22f410c25e0e5f71a3131ebd07d /src/dynlib.c | |
parent | 8869332684c2302b5ba1ead4568bbc7ba1c0183e (diff) | |
parent | 4b85ae6a24380fb67a3315eaec9233f17a872473 (diff) | |
download | emacs-650c20f1ca4e07591a727e1cfcc74b3363d15985.tar.gz emacs-650c20f1ca4e07591a727e1cfcc74b3363d15985.tar.bz2 emacs-650c20f1ca4e07591a727e1cfcc74b3363d15985.zip |
Merge 'master' into noverlay
Diffstat (limited to 'src/dynlib.c')
-rw-r--r-- | src/dynlib.c | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/src/dynlib.c b/src/dynlib.c index a6d70484fc6..e2c71f14489 100644 --- a/src/dynlib.c +++ b/src/dynlib.c @@ -1,6 +1,6 @@ /* Portable API for dynamic loading. -Copyright 2015-2017 Free Software Foundation, Inc. +Copyright 2015-2022 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -104,6 +104,12 @@ dynlib_open (const char *dll_fname) return (dynlib_handle_ptr) hdll; } +dynlib_handle_ptr +dynlib_open_for_eln (const char *dll_fname) +{ + return dynlib_open (dll_fname); +} + void * dynlib_sym (dynlib_handle_ptr h, const char *sym) { @@ -123,7 +129,7 @@ dynlib_sym (dynlib_handle_ptr h, const char *sym) } void -dynlib_addr (void *addr, const char **fname, const char **symname) +dynlib_addr (void (*funcptr) (void), const char **fname, const char **symname) { static char dll_filename[MAX_UTF8_PATH]; static GetModuleHandleExA_Proc s_pfn_Get_Module_HandleExA = NULL; @@ -132,9 +138,10 @@ dynlib_addr (void *addr, const char **fname, const char **symname) HMODULE hm_dll = NULL; wchar_t mfn_w[MAX_PATH]; char mfn_a[MAX_PATH]; + void *addr = (void *) funcptr; /* Step 1: Find the handle of the module where ADDR lives. */ - if (os_subtype == OS_9X + if (os_subtype == OS_SUBTYPE_9X /* Windows NT family version before XP (v5.1). */ || ((w32_major_version + (w32_minor_version > 0)) < 6)) { @@ -156,9 +163,8 @@ dynlib_addr (void *addr, const char **fname, const char **symname) address we pass to it is not an address of a string, but an address of a function. So we don't care about the Unicode version. */ - s_pfn_Get_Module_HandleExA = - (GetModuleHandleExA_Proc) GetProcAddress (hm_kernel32, - "GetModuleHandleExA"); + s_pfn_Get_Module_HandleExA = (GetModuleHandleExA_Proc) + get_proc_addr (hm_kernel32, "GetModuleHandleExA"); } if (s_pfn_Get_Module_HandleExA) { @@ -270,8 +276,16 @@ dynlib_close (dynlib_handle_ptr h) dynlib_handle_ptr dynlib_open (const char *path) { + return dlopen (path, RTLD_LAZY | RTLD_GLOBAL); +} + +# ifdef HAVE_NATIVE_COMP +dynlib_handle_ptr +dynlib_open_for_eln (const char *path) +{ return dlopen (path, RTLD_LAZY); } +# endif void * dynlib_sym (dynlib_handle_ptr h, const char *sym) @@ -280,11 +294,12 @@ dynlib_sym (dynlib_handle_ptr h, const char *sym) } void -dynlib_addr (void *ptr, const char **path, const char **sym) +dynlib_addr (void (*funcptr) (void), const char **path, const char **sym) { *path = NULL; *sym = NULL; #ifdef HAVE_DLADDR + void *ptr = (void *) funcptr; Dl_info info; if (dladdr (ptr, &info) && info.dli_fname && info.dli_sname) { @@ -300,15 +315,13 @@ dynlib_error (void) return dlerror (); } -/* FIXME: Currently there is no way to unload a module, so this - function is never used. */ -#if false +# ifdef HAVE_NATIVE_COMP int dynlib_close (dynlib_handle_ptr h) { return dlclose (h) == 0; } -#endif +# endif #else |