]> git.eshelyaron.com Git - emacs.git/commitdiff
Have 'dlopen' use RTLD_GLOBAL in 'dynlib_open'
authorAndrea Corallo <akrl@sdf.org>
Wed, 15 Dec 2021 14:47:14 +0000 (15:47 +0100)
committerAndrea Corallo <akrl@sdf.org>
Wed, 15 Dec 2021 14:55:01 +0000 (15:55 +0100)
* 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'.

src/comp.c
src/dynlib.c
src/dynlib.h
src/pdumper.c

index fb9b1a5a2d8b7d9f22370f9fdb00ac95c5165d3e..1fb384840cfbc57bf07b73739521f75ab913da60 100644 (file)
@@ -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,
index a8c884396156593d26e0fda9c3fdd47c2d9b215d..e9a775f2d3c6f40cfe25064e23041ab02f94d7b1 100644 (file)
@@ -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);
 }
index e20d8891a238629eac6808066d742a2975d877be..05ba7981226e5147d2a142cdfcfa4f43deb61e9c 100644 (file)
@@ -24,6 +24,7 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 
 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);
 
index 8f03684df5afcf29efbaab5cebece269c8cd77da..554b53020e0262655be136e5b5f48034c8f68a48 100644 (file)
@@ -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",