From: Andrea Corallo Date: Wed, 15 Dec 2021 14:47:14 +0000 (+0100) Subject: Have 'dlopen' use RTLD_GLOBAL in 'dynlib_open' X-Git-Tag: emacs-29.0.90~3592^2~13 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=e6b93245fe41731173854e48441614881478c9cf;p=emacs.git Have 'dlopen' use RTLD_GLOBAL in 'dynlib_open' * src/pdumper.c (dump_do_dump_relocation): Use 'dynlib_open_for_eln' in place of 'dynlib_open'. * src/dynlib.h (dynlib_open_for_eln): Declare it. * src/dynlib.c (dynlib_open_for_eln): New function. (dynlib_open): Add RTLD_GLOBAL. * src/comp.c (Fnative_elisp_load): Use 'dynlib_open_for_eln' in place of 'dynlib_open'. --- diff --git a/src/comp.c b/src/comp.c index fb9b1a5a2d8..1fb384840cf 100644 --- a/src/comp.c +++ b/src/comp.c @@ -5278,16 +5278,16 @@ LATE_LOAD has to be non-nil when loading for deferred compilation. */) Fmake_temp_file_internal (filename, Qnil, build_string (".eln.tmp"), Qnil); if (NILP (Ffile_writable_p (tmp_filename))) - comp_u->handle = dynlib_open (SSDATA (encoded_filename)); + comp_u->handle = dynlib_open_for_eln (SSDATA (encoded_filename)); else { Frename_file (filename, tmp_filename, Qt); - comp_u->handle = dynlib_open (SSDATA (ENCODE_FILE (tmp_filename))); + comp_u->handle = dynlib_open_for_eln (SSDATA (ENCODE_FILE (tmp_filename))); Frename_file (tmp_filename, filename, Qnil); } } else - comp_u->handle = dynlib_open (SSDATA (encoded_filename)); + comp_u->handle = dynlib_open_for_eln (SSDATA (encoded_filename)); if (!comp_u->handle) xsignal2 (Qnative_lisp_load_failed, filename, diff --git a/src/dynlib.c b/src/dynlib.c index a8c88439615..e9a775f2d3c 100644 --- a/src/dynlib.c +++ b/src/dynlib.c @@ -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) { @@ -269,6 +275,12 @@ dynlib_close (dynlib_handle_ptr h) dynlib_handle_ptr dynlib_open (const char *path) +{ + return dlopen (path, RTLD_LAZY | RTLD_GLOBAL); +} + +dynlib_handle_ptr +dynlib_open_for_eln (const char *path) { return dlopen (path, RTLD_LAZY); } diff --git a/src/dynlib.h b/src/dynlib.h index e20d8891a23..05ba7981226 100644 --- a/src/dynlib.h +++ b/src/dynlib.h @@ -24,6 +24,7 @@ along with GNU Emacs. If not, see . */ typedef void *dynlib_handle_ptr; dynlib_handle_ptr dynlib_open (const char *path); +dynlib_handle_ptr dynlib_open_for_eln (const char *path); int dynlib_close (dynlib_handle_ptr h); const char *dynlib_error (void); diff --git a/src/pdumper.c b/src/pdumper.c index 8f03684df5a..554b53020e0 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -5353,7 +5353,7 @@ dump_do_dump_relocation (const uintptr_t dump_base, their file names through expand-file-name and decode-coding-string. */ comp_u->file = eln_fname; - comp_u->handle = dynlib_open (SSDATA (eln_fname)); + comp_u->handle = dynlib_open_for_eln (SSDATA (eln_fname)); if (!comp_u->handle) { fprintf (stderr, "Error using execdir %s:\n",