PR ld/13287
[deliverable/binutils-gdb.git] / ld / pe-dll.c
index 7de718ab58e68b25002a293de05be15aecfd5b25..ce0ab5d2ea79e24fd8aa0ecf9d763e3ed71dd9dd 100644 (file)
@@ -1,6 +1,6 @@
 /* Routines to help build PEI-format DLLs (Win32 etc)
    Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
-   2008, 2009, 2010 Free Software Foundation, Inc.
+   2008, 2009, 2010, 2011 Free Software Foundation, Inc.
    Written by DJ Delorie <dj@cygnus.com>
 
    This file is part of the GNU Binutils.
@@ -718,13 +718,10 @@ process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *
              bfd_boolean would_export = symbols[j]->section != &bfd_und_section
                      && ((symbols[j]->flags & BSF_GLOBAL)
                          || (symbols[j]->flags == 0));
-             if (lang_elf_version_info && would_export)
-               {
-                 bfd_boolean hide = 0;
-                 (void) bfd_find_version_for_sym (lang_elf_version_info,
-                               symbols[j]->name, &hide);
-                 would_export = !hide;
-               }
+             if (link_info.version_info && would_export)
+                 would_export
+                   = !bfd_hide_sym_by_version (link_info.version_info,
+                                               symbols[j]->name);
              if (would_export)
                {
                  const char *sn = symbols[j]->name;
@@ -751,10 +748,13 @@ process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *
 
                  if (auto_export (b, pe_def_file, sn))
                    {
+                     int is_dup = 0;
                      def_file_export *p;
-                     p=def_file_add_export (pe_def_file, sn, 0, -1, NULL);
+                     p = def_file_add_export (pe_def_file, sn, 0, -1,
+                                              NULL, &is_dup);
                      /* Fill data flag properly, from dlltool.c.  */
-                     p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
+                     if (!is_dup)
+                       p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
                    }
                }
            }
@@ -801,6 +801,7 @@ process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *
 
          if (strchr (pe_def_file->exports[i].name, '@'))
            {
+             int is_dup = 1;
              int lead_at = (*pe_def_file->exports[i].name == '@');
              char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
 
@@ -808,9 +809,9 @@ process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *
              if (auto_export (NULL, pe_def_file, tmp))
                def_file_add_export (pe_def_file, tmp,
                                     pe_def_file->exports[i].internal_name,
-                                    -1, NULL);
-             else
-               free (tmp);
+                                    -1, NULL, &is_dup);
+             if (is_dup)
+               free (tmp);
            }
        }
     }
@@ -1394,6 +1395,15 @@ generate_reloc (bfd *abfd, struct bfd_link_info *info)
                      else if (!blhe || blhe->type != bfd_link_hash_defined)
                        continue;
                    }
+                 /* Nor for Dwarf FDE references to discarded sections.  */
+                 else if (bfd_is_abs_section (sym->section->output_section))
+                   {
+                     /* We only ignore relocs from .eh_frame sections, as
+                        they are discarded by the final link rather than
+                        resolved against the kept section.  */
+                     if (!strcmp (s->name, ".eh_frame"))
+                       continue;
+                   }
 
                  reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
 
@@ -3146,6 +3156,7 @@ pe_implied_import_dll (const char *filename)
         exported in buggy auto-import releases.  */
       if (! CONST_STRNEQ (erva + name_rva, "__nm_"))
        {
+         int is_dup = 0;
          /* is_data is true if the address is in the data, rdata or bss
             segment.  */
          is_data =
@@ -3154,9 +3165,10 @@ pe_implied_import_dll (const char *filename)
            || (func_rva >= bss_start && func_rva < bss_end);
 
          imp = def_file_add_import (pe_def_file, erva + name_rva,
-                                    dllname, i, 0, NULL);
+                                    dllname, i, 0, NULL, &is_dup);
          /* Mark symbol type.  */
-         imp->data = is_data;
+         if (!is_dup)
+           imp->data = is_data;
 
          if (pe_dll_extra_pe_debug)
            printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
@@ -3226,7 +3238,7 @@ pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
       ldemul_after_allocation ();
 
       /* Do the assignments again.  */
-      lang_do_assignments ();
+      lang_do_assignments (lang_final_phase_enum);
     }
 
   fill_edata (abfd, info);
@@ -3258,7 +3270,7 @@ pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
       ldemul_after_allocation ();
 
       /* Do the assignments again.  */
-      lang_do_assignments ();
+      lang_do_assignments (lang_final_phase_enum);
     }
   reloc_s->contents = reloc_d;
 }
This page took 0.026484 seconds and 4 git commands to generate.