2005-08-04 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 4 Aug 2005 14:49:55 +0000 (14:49 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 4 Aug 2005 14:49:55 +0000 (14:49 +0000)
* elf64-x86-64.c (elf64_x86_64_merge_symbol): When mixing a
large common symbol and a normal common symbol, always turn
the large common symbol into a normal one.

bfd/ChangeLog
bfd/elf64-x86-64.c

index 3854c21fbff776ed6f2741f3584dd65f355a29d2..db023c91c988279b4bccb302a5e9b6cdb77df9e2 100644 (file)
@@ -1,3 +1,9 @@
+2005-08-04  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * elf64-x86-64.c (elf64_x86_64_merge_symbol): When mixing a
+       large common symbol and a normal common symbol, always turn
+       the large common symbol into a normal one.
+
 2005-08-04  Alan Modra  <amodra@bigpond.net.au>
 
        * elf32-ppc.c (struct elf_linker_section): Replace sym_val field
index 196b237bdb23205e0634cee29b11253af0e2a442..7b06ef4a71aa74f95a687d468f0f814db5dbc775 100644 (file)
@@ -3014,7 +3014,7 @@ elf64_x86_64_merge_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
                           struct elf_link_hash_entry **sym_hash ATTRIBUTE_UNUSED,
                           struct elf_link_hash_entry *h,
                           Elf_Internal_Sym *sym,
-                          asection **psec ATTRIBUTE_UNUSED,
+                          asection **psec,
                           bfd_vma *pvalue ATTRIBUTE_UNUSED,
                           unsigned int *pold_alignment ATTRIBUTE_UNUSED,
                           bfd_boolean *skip ATTRIBUTE_UNUSED,
@@ -3031,25 +3031,28 @@ elf64_x86_64_merge_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
                           bfd_boolean *olddyn,
                           bfd_boolean *olddyncommon ATTRIBUTE_UNUSED,
                           bfd_boolean *oldweak ATTRIBUTE_UNUSED,
-                          bfd *oldbfd ATTRIBUTE_UNUSED,
+                          bfd *oldbfd,
                           asection **oldsec)
 {
   /* A normal common symbol and a large common symbol result in a
-     normal common symbol.  If we see the normal symbol first, we
-     do nothing since the first one will be used.  If we see the
-     large common symbol first, we need to change the large common
-     symbol to the normal common symbol.  */
+     normal common symbol.  We turn the large common symbol into a
+     normal one.  */
   if (!*olddyn
       && h->root.type == bfd_link_hash_common
       && !*newdyn
       && bfd_is_com_section (*sec)
-      && *oldsec != *sec
-      && sym->st_shndx == SHN_COMMON
-      && (elf_section_flags (*oldsec) & SHF_X86_64_LARGE) != 0)
+      && *oldsec != *sec)
     {
-      h->root.u.c.p->section = bfd_make_section_old_way (abfd,
-                                                        "COMMON");
-      h->root.u.c.p->section->flags = SEC_ALLOC;
+      if (sym->st_shndx == SHN_COMMON
+         && (elf_section_flags (*oldsec) & SHF_X86_64_LARGE) != 0)
+       {
+         h->root.u.c.p->section
+           = bfd_make_section_old_way (oldbfd, "COMMON");
+         h->root.u.c.p->section->flags = SEC_ALLOC;
+       }
+      else if (sym->st_shndx == SHN_X86_64_LCOMMON
+              && (elf_section_flags (*oldsec) & SHF_X86_64_LARGE) == 0)
+       *psec = *sec = bfd_com_section_ptr; 
     }
 
   return TRUE;