daily update
[binutils-gdb.git] / ld / pe-dll.c
index cac0dbec874b5423e265c09f5fcf83a960de9423..1430754842a6515abd282b4a17e9503fa539cd5e 100644 (file)
@@ -199,7 +199,7 @@ static pe_details_type pe_detail_list[] =
     11 /* ARM_RVA32 */,
     PE_ARCH_arm,
     bfd_arch_arm,
-    0
+    1
   },
   {
     "epoc-pei-arm-little",
@@ -225,6 +225,7 @@ static autofilter_entry_type autofilter_symbollist[] =
   { "impure_ptr", 10 },
   { "_pei386_runtime_relocator", 25 },
   { "do_pseudo_reloc", 15 },
+  { "cygwin_crt0", 11 },
   { NULL, 0 }
 };
 
@@ -563,6 +564,12 @@ process_def_file (abfd, info)
        }
     }
 
+  /* If we are not building a DLL, when there are no exports
+     we do not build an export table at all.  */
+  if (!pe_dll_export_everything && pe_def_file->num_exports == 0
+      && !(info->shared))
+    return;
+
   /* Now, maybe export everything else the default way.  */
   if (pe_dll_export_everything || pe_def_file->num_exports == 0)
     {
@@ -2017,8 +2024,8 @@ make_import_fixup_mark (rel)
      overflowing this buffer...  */
     {
       free (fixup_name);
-      /* New buffer size is length of symbol, plus 25, but then
-        rounded up to the nearest multiple of 128.  */
+      /* New buffer size is length of symbol, plus 25, but
+        then rounded up to the nearest multiple of 128.  */
       buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
       fixup_name = (char *) xmalloc (buffer_len);
     }
@@ -2152,7 +2159,7 @@ make_runtime_pseudo_reloc (name, fixup_name, addend, parent)
 }
 
 /*     .section        .rdata
-       .rva            __pei386_runtime_relocator */
+       .rva            __pei386_runtime_relocator  */
 
 static bfd *
 pe_create_runtime_relocator_reference (parent)
@@ -2608,6 +2615,16 @@ pe_implied_import_dll (filename)
      to enable symbolic dll linking.  */
   dll_name = pe_as32 (expdata + 12) + erva;
 
+  /* Check to see if the dll has already been added to
+     the definition list and if so return without error.
+     This avoids multiple symbol definitions.  */
+  if (def_get_module (pe_def_file, dll_name))
+    {
+      if (pe_dll_extra_pe_debug)
+       printf ("%s is already loaded\n", dll_name);
+      return TRUE;
+    }
+
   /* Iterate through the list of symbols.  */
   for (i = 0; i < nexp; i++)
     {
@@ -2655,6 +2672,9 @@ pe_dll_build_sections (abfd, info)
   pe_dll_id_target (bfd_get_target (abfd));
   process_def_file (abfd, info);
 
+  if (pe_def_file->num_exports == 0 && !(info->shared))
+    return;
+
   generate_edata (abfd, info);
   build_filler_bfd (1);
 }
@@ -2683,7 +2703,7 @@ pe_dll_fill_sections (abfd, info)
 
       /* Resize the sections.  */
       lang_size_sections (stat_ptr->head, abs_output_section,
-                         &stat_ptr->head, 0, (bfd_vma) 0, NULL);
+                         &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE);
 
       /* Redo special stuff.  */
       ldemul_after_allocation ();
@@ -2696,7 +2716,8 @@ pe_dll_fill_sections (abfd, info)
 
   fill_edata (abfd, info);
 
-  pe_data (abfd)->dll = 1;
+  if (info->shared)
+    pe_data (abfd)->dll = 1;
 
   edata_s->contents = edata_d;
   reloc_s->contents = reloc_d;
@@ -2717,7 +2738,7 @@ pe_exe_fill_sections (abfd, info)
 
       /* Resize the sections.  */
       lang_size_sections (stat_ptr->head, abs_output_section,
-                         &stat_ptr->head, 0, (bfd_vma) 0, NULL);
+                         &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE);
 
       /* Redo special stuff.  */
       ldemul_after_allocation ();