gdb/gdbserver/
[deliverable/binutils-gdb.git] / ld / pe-dll.c
index 9b3c699fb17f55482d07db6ae38f2596a5070a56..21717fc5ce5823ffa0252decfb38bf1be188197d 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 Free Software Foundation, Inc.
+   2008, 2009, 2010 Free Software Foundation, Inc.
    Written by DJ Delorie <dj@cygnus.com>
 
    This file is part of the GNU Binutils.
@@ -158,6 +158,7 @@ int pe_dll_compat_implib = 0;
 int pe_dll_extra_pe_debug = 0;
 int pe_use_nul_prefixed_import_tables = 0;
 int pe_use_coff_long_section_names = -1;
+int pe_leading_underscore = -1;
 
 /* Static variables and types.  */
 
@@ -244,7 +245,9 @@ static const autofilter_entry_type autofilter_symbollist_i386[] =
 #define PE_ARCH_arm_epoc 5
 #define PE_ARCH_arm_wince 6
 
-static const pe_details_type pe_detail_list[] =
+/* Don't make it constant as underscore mode gets possibly overriden
+   by target or -(no-)leading-underscore option.  */
+static pe_details_type pe_detail_list[] =
 {
   {
 #ifdef pe_use_x86_64
@@ -410,6 +413,11 @@ pe_dll_id_target (const char *target)
     if (strcmp (pe_detail_list[i].target_name, target) == 0
        || strcmp (pe_detail_list[i].object_target, target) == 0)
       {
+       int u = pe_leading_underscore; /* Underscoring mode. -1 for use default.  */
+       if (u == -1)
+         bfd_get_target_info (target, NULL, NULL, &u, NULL);
+       if (u != -1)
+         pe_detail_list[i].underscored = (u != 0 ? TRUE : FALSE);
        pe_details = pe_detail_list + i;
        return;
       }
@@ -1361,10 +1369,29 @@ generate_reloc (bfd *abfd, struct bfd_link_info *info)
                  if (sym->flags == BSF_WEAK)
                    {
                      struct bfd_link_hash_entry *blhe
-                       = bfd_link_hash_lookup (info->hash, sym->name,
+                       = bfd_wrapped_link_hash_lookup (abfd, info, sym->name,
                                                FALSE, FALSE, FALSE);
-                     if (!blhe || blhe->type != bfd_link_hash_defined)
-                       continue;                     
+                     if (blhe && blhe->type == bfd_link_hash_undefweak)
+                       {
+                         /* Check aux sym and see if it is defined or not. */
+                         struct coff_link_hash_entry *h, *h2;
+                         h = (struct coff_link_hash_entry *)blhe;
+                         if (h->symbol_class != C_NT_WEAK || h->numaux != 1)
+                           continue;
+                         h2 = h->auxbfd->tdata.coff_obj_data->sym_hashes
+                                               [h->aux->x_sym.x_tagndx.l];
+                         /* We don't want a base reloc if the aux sym is not
+                            found, undefined, or if it is the constant ABS
+                            zero default value.  (We broaden that slightly by
+                            not testing the value, just the section; there's
+                            no reason we'd want a reference to any absolute
+                            address to get relocated during rebasing).  */
+                         if (!h2 || h2->root.type == bfd_link_hash_undefined
+                               || h2->root.u.def.section == &bfd_abs_section)
+                           continue;
+                       }
+                     else if (!blhe || blhe->type != bfd_link_hash_defined)
+                       continue;
                    }
 
                  sym_vma = (relocs[i]->addend
@@ -2077,8 +2104,9 @@ make_one (def_file_export *exp, bfd *parent, bfd_boolean include_jmp_stub)
   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
 
   symptr = 0;
-  symtab = xmalloc (11 * sizeof (asymbol *));
-  tx  = quick_section (abfd, ".text",    SEC_CODE|SEC_HAS_CONTENTS, 2);
+  symtab = xmalloc (12 * sizeof (asymbol *));
+
+  tx  = quick_section (abfd, ".text", SEC_CODE | SEC_HAS_CONTENTS | SEC_READONLY, 2);
   id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
@@ -2127,6 +2155,9 @@ make_one (def_file_export *exp, bfd *parent, bfd_boolean include_jmp_stub)
 #ifdef pe_use_x86_64
          quick_reloc (abfd, 2, BFD_RELOC_32_PCREL, 2);
 #else
+         /* Mark this object as SAFESEH compatible.  */
+         quick_symbol (abfd, "", "@feat.00", "", bfd_abs_section_ptr,
+                       BSF_LOCAL, 1);
           quick_reloc (abfd, 2, BFD_RELOC_32, 2);
 #endif
          break;
This page took 0.024908 seconds and 4 git commands to generate.