Fix multiple problems with DLL generation.
authorMartin Storsj <martin@martin.st>
Tue, 11 Jan 2022 15:43:59 +0000 (15:43 +0000)
committerNick Clifton <nickc@redhat.com>
Tue, 11 Jan 2022 15:43:59 +0000 (15:43 +0000)
ld * pe-dll.c (make_head): Prefix the symbol name with the dll name.
(make_tail, make_one, make_singleton_name_thunk): Likewise.
(make_import_fixup_entry, make_runtime_pseudo_reloc): Likewise.
(pe_create_runtime_relocator_reference): Likewise.
(pe_dll_generate_implib): Set dll_symname_len.
(pe_process_import_defs): Likewise.

binutils
* dlltool.c (main): If a prefix has not been provided, attempt to
use a deterministic one based upon the dll name.

binutils/ChangeLog
binutils/dlltool.c
ld/ChangeLog
ld/pe-dll.c

index ff25db288a7de142a816ab89d4443306956a6bef..8e31f1472cc85f09b7a6148c577f99d54cfb1590 100644 (file)
@@ -1,3 +1,8 @@
+2022-01-11  Martin Storsjö  <martin@martin.st>
+
+       * dlltool.c (main): If a prefix has not been provided, attempt to
+       use a deterministic one based upon the dll name.
+
 2022-01-07  Pavel Mayorov  <pmayorov@cloudlinux.com>
 
        PR 28718
index 8c1ddd61f63b007c5bbd7c889810c4de8b6f367c..a1e2b484328ad69e302e55947e6cb45c896649ce 100644 (file)
@@ -348,7 +348,7 @@ typedef struct iheadt
 static iheadtype *import_list = NULL;
 static char *as_name = NULL;
 static char * as_flags = "";
-static char *tmp_prefix;
+static char *tmp_prefix = NULL;
 static int no_idata4;
 static int no_idata5;
 static char *exp_name;
@@ -3930,8 +3930,22 @@ main (int ac, char **av)
        }
     }
 
-  if (!tmp_prefix)
-    tmp_prefix = prefix_encode ("d", getpid ());
+  if (tmp_prefix == NULL)
+    {
+      /* If possible use a deterministic prefix.  */
+      if (dll_name)
+        {
+          tmp_prefix = xmalloc (strlen (dll_name) + 2);
+          sprintf (tmp_prefix, "%s_", dll_name);
+          for (i = 0; tmp_prefix[i]; i++)
+            if (!ISALNUM (tmp_prefix[i]))
+              tmp_prefix[i] = '_';
+        }
+      else
+        {
+          tmp_prefix = prefix_encode ("d", getpid ());
+        }
+    }
 
   for (i = 0; mtable[i].type; i++)
     if (strcmp (mtable[i].type, mname) == 0)
index 6083c99f44743b4fbb06d413906ac7f1376d2b40..441187db2396143badf0452089d0dee4b01713ac 100644 (file)
@@ -1,3 +1,12 @@
+2022-01-11  Martin Storsjö  <martin@martin.st>
+
+       * pe-dll.c (make_head): Prefix the symbol name with the dll name.
+       (make_tail, make_one, make_singleton_name_thunk): Likewise.
+       (make_import_fixup_entry, make_runtime_pseudo_reloc): Likewise.
+       (pe_create_runtime_relocator_reference): Likewise.
+       (pe_dll_generate_implib): Set dll_symname_len.
+       (pe_process_import_defs): Likewise.
+
 2021-12-16  Nick Clifton  <nickc@redhat.com>
 
        PR 28686
index 907fafc62087bb73a7828fe189623f40395e9b8c..95de94b84745076989442531ee42a2859344f4ca 100644 (file)
@@ -348,6 +348,7 @@ static const autofilter_entry_type autofilter_liblist[] =
   { STRING_COMMA_LEN ("libgcj") },
   { STRING_COMMA_LEN ("libmsvcrt") },
   { STRING_COMMA_LEN ("libmsvcrt-os") },
+  { STRING_COMMA_LEN ("libucrt") },
   { STRING_COMMA_LEN ("libucrtbase") },
   { NULL, 0 }
 };
@@ -1972,6 +1973,7 @@ static int symptr;
 static int tmp_seq;
 static const char *dll_filename;
 static char *dll_symname;
+static int dll_symname_len;
 
 #define UNDSEC bfd_und_section_ptr
 
@@ -2082,8 +2084,8 @@ make_head (bfd *parent)
   char *oname;
   bfd *abfd;
 
-  oname = xmalloc (20);
-  sprintf (oname, "d%06d.o", tmp_seq);
+  oname = xmalloc (20 + dll_symname_len);
+  sprintf (oname, "%s_d%06d.o", dll_symname, tmp_seq);
   tmp_seq++;
 
   abfd = bfd_create (oname, parent);
@@ -2171,8 +2173,8 @@ make_tail (bfd *parent)
   char *oname;
   bfd *abfd;
 
-  oname = xmalloc (20);
-  sprintf (oname, "d%06d.o", tmp_seq);
+  oname = xmalloc (20 + dll_symname_len);
+  sprintf (oname, "%s_d%06d.o", dll_symname, tmp_seq);
   tmp_seq++;
 
   abfd = bfd_create (oname, parent);
@@ -2322,8 +2324,8 @@ make_one (def_file_export *exp, bfd *parent, bool include_jmp_stub)
        }
     }
 
-  oname = xmalloc (20);
-  sprintf (oname, "d%06d.o", tmp_seq);
+  oname = xmalloc (20 + dll_symname_len);
+  sprintf (oname, "%s_d%06d.o", dll_symname, tmp_seq);
   tmp_seq++;
 
   abfd = bfd_create (oname, parent);
@@ -2508,8 +2510,8 @@ make_singleton_name_thunk (const char *import, bfd *parent)
   char *oname;
   bfd *abfd;
 
-  oname = xmalloc (20);
-  sprintf (oname, "nmth%06d.o", tmp_seq);
+  oname = xmalloc (20 + dll_symname_len);
+  sprintf (oname, "%s_nmth%06d.o", dll_symname, tmp_seq);
   tmp_seq++;
 
   abfd = bfd_create (oname, parent);
@@ -2584,8 +2586,8 @@ make_import_fixup_entry (const char *name,
   char *oname;
   bfd *abfd;
 
-  oname = xmalloc (20);
-  sprintf (oname, "fu%06d.o", tmp_seq);
+  oname = xmalloc (20 + dll_symname_len);
+  sprintf (oname, "%s_fu%06d.o", dll_symname, tmp_seq);
   tmp_seq++;
 
   abfd = bfd_create (oname, parent);
@@ -2638,8 +2640,8 @@ make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
   bfd *abfd;
   bfd_size_type size;
 
-  oname = xmalloc (20);
-  sprintf (oname, "rtr%06d.o", tmp_seq);
+  oname = xmalloc (20 + dll_symname_len);
+  sprintf (oname, "%s_rtr%06d.o", dll_symname, tmp_seq);
   tmp_seq++;
 
   abfd = bfd_create (oname, parent);
@@ -2725,8 +2727,8 @@ pe_create_runtime_relocator_reference (bfd *parent)
   char *oname;
   bfd *abfd;
 
-  oname = xmalloc (20);
-  sprintf (oname, "ertr%06d.o", tmp_seq);
+  oname = xmalloc (20 + dll_symname_len);
+  sprintf (oname, "%s_ertr%06d.o", dll_symname, tmp_seq);
   tmp_seq++;
 
   abfd = bfd_create (oname, parent);
@@ -2833,6 +2835,7 @@ pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_
 
   dll_filename = (def->name) ? def->name : dll_name;
   dll_symname = xstrdup (dll_filename);
+  dll_symname_len = strlen (dll_symname);
   for (i = 0; dll_symname[i]; i++)
     if (!ISALNUM (dll_symname[i]))
       dll_symname[i] = '_';
@@ -3201,6 +3204,7 @@ pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *linfo)
 
       dll_filename = module->name;
       dll_symname = xstrdup (module->name);
+      dll_symname_len = strlen (dll_symname);
       for (j = 0; dll_symname[j]; j++)
        if (!ISALNUM (dll_symname[j]))
          dll_symname[j] = '_';