[PATCH] SH: weak and visibility patch

kaz Kojima kkojima@rr.iij4u.or.jp
Wed May 7 11:37:00 GMT 2003


Hi,

The attached patch is the SH version of the recent change for
the weak symbols and the visibility for other architectures.
It is tested on sh4-unknown-linux-gnu and sh64-unknown-linux-gnu,
without no new regressions and some regressions went away.
It seems that some remained FAILs come from gcc optimization.
I'd like to check in the change of elf32-sh.c, but I'm afraid
bothering 2.14 releasing work. So I'm waiting for comments.
Even if it's ok, I need an approvement for ld/testsuite part.

Regards,
	kaz
--
2003-05-07  Kaz Kojima  <kkojima@rr.iij4u.or.jp>

[bfd/ChangeLog]
	* elf32-sh.c (sh_elf_adjust_dynamic_symbol): For weak symbols,
	copy ELF_LINK_NON_GOT_REF from weakdef.
	(allocate_dynrelocs):  For undef weak syms with non-default
	visibility, a) don't allocate plt entries, b) don't allocate
	.got relocs, c) discard dyn rel space
        (sh_elf_relocate_section): d) don't generate .got relocs, e)
        don't generate dynamic relocs.
	(sh_elf_copy_indirect_symbol): Don't copy ELF_LINK_NON_GOT_REF
	for weakdefs when symbol already adjusted.

[ld/testsuite/ChangeLog]
	* ld-elfvers/vers.exp: Run on sh[34]*-*-linux*.
	* ld-elfvsb/elfvsb.exp: Likewise.
	* ld-elfweak/elfweak.exp: Likewise.

diff -u3prN ORIG/src/bfd/elf32-sh.c LOCAL/src/bfd/elf32-sh.c
--- ORIG/src/bfd/elf32-sh.c	Thu Apr 24 13:58:25 2003
+++ LOCAL/src/bfd/elf32-sh.c	Wed May  7 18:29:29 2003
@@ -3940,6 +3940,10 @@ sh_elf_adjust_dynamic_symbol (info, h)
 		  || h->weakdef->root.type == bfd_link_hash_defweak);
       h->root.u.def.section = h->weakdef->root.u.def.section;
       h->root.u.def.value = h->weakdef->root.u.def.value;
+      if (info->nocopyreloc)
+	h->elf_link_hash_flags
+	  = ((h->elf_link_hash_flags & ~ELF_LINK_NON_GOT_REF)
+	     | (h->weakdef->elf_link_hash_flags & ELF_LINK_NON_GOT_REF));
       return TRUE;
     }
 
@@ -4083,7 +4087,9 @@ allocate_dynrelocs (h, inf)
     }
 
   if (htab->root.dynamic_sections_created
-      && h->plt.refcount > 0)
+      && h->plt.refcount > 0
+      && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
+	  || h->root.type != bfd_link_hash_undefweak))
     {
       /* Make sure this symbol is output as a dynamic symbol.
 	 Undefined weak syms won't yet be marked as dynamic.  */
@@ -4169,8 +4175,10 @@ allocate_dynrelocs (h, inf)
 	htab->srelgot->_raw_size += sizeof (Elf32_External_Rela);
       else if (tls_type == GOT_TLS_GD)
 	htab->srelgot->_raw_size += 2 * sizeof (Elf32_External_Rela);
-      else if (info->shared ||
-	       WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
+      else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
+		|| h->root.type != bfd_link_hash_undefweak)
+	       && (info->shared
+		   || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
 	htab->srelgot->_raw_size += sizeof (Elf32_External_Rela);
     }
   else
@@ -4229,6 +4237,12 @@ allocate_dynrelocs (h, inf)
 		pp = &p->next;
 	    }
 	}
+
+      /* Also discard relocs on undefined weak syms with non-default
+	 visibility.  */
+      if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
+	  && h->root.type == bfd_link_hash_undefweak)
+	eh->dyn_relocs = NULL;
     }
   else
     {
@@ -4885,6 +4899,9 @@ sh_elf_relocate_section (output_bfd, inf
 	case R_SH_DIR32:
 	case R_SH_REL32:
 	  if (info->shared
+	      && (h == NULL
+		  || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
+		  || h->root.type != bfd_link_hash_undefweak)
 	      && r_symndx != 0
 	      && (input_section->flags & SEC_ALLOC) != 0
 	      && (r_type != R_SH_REL32
@@ -5053,7 +5070,9 @@ sh_elf_relocate_section (output_bfd, inf
 		  || (info->shared
 		      && (info->symbolic || h->dynindx == -1
 			  || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
-		      && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
+		      && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
+		  || (ELF_ST_VISIBILITY (h->other)
+		      && h->root.type == bfd_link_hash_undefweak))
 		{
 		  /* This is actually a static link, or it is a
 		     -Bsymbolic link and the symbol is defined
@@ -6128,7 +6147,17 @@ sh_elf_copy_indirect_symbol (bed, dir, i
       eind->tls_type = GOT_UNKNOWN;
     }
 
-  _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
+  if (ind->root.type != bfd_link_hash_indirect
+      && (dir->elf_link_hash_flags & ELF_LINK_HASH_DYNAMIC_ADJUSTED) != 0)
+    /* If called to transfer flags for a weakdef during processing
+       of elf_adjust_dynamic_symbol, don't copy ELF_LINK_NON_GOT_REF.
+       We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
+    dir->elf_link_hash_flags |=
+      (ind->elf_link_hash_flags & (ELF_LINK_HASH_REF_DYNAMIC
+				   | ELF_LINK_HASH_REF_REGULAR
+				   | ELF_LINK_HASH_REF_REGULAR_NONWEAK));
+  else
+    _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
 }
 
 static int
Binary files ORIG/src/bfd/po/zh_CN.gmo and LOCAL/src/bfd/po/zh_CN.gmo differ
diff -u3prN ORIG/src/ld/testsuite/ld-elfvers/vers.exp LOCAL/src/ld/testsuite/ld-elfvers/vers.exp
--- ORIG/src/ld/testsuite/ld-elfvers/vers.exp	Sun May  4 08:27:49 2003
+++ LOCAL/src/ld/testsuite/ld-elfvers/vers.exp	Wed May  7 18:36:02 2003
@@ -45,7 +45,8 @@ if { ![istarget hppa*64*-*-hpux*] \
      && ![istarget mips*-*-linux*] \
      && ![istarget alpha*-*-linux*] \
      && ![istarget s390*-*-linux*] \
-     && ![istarget x86_64-*-linux*] } {
+     && ![istarget x86_64-*-linux*] \
+     && ![istarget sh\[34\]*-*-linux*] } {
     return
 }
 
diff -u3prN ORIG/src/ld/testsuite/ld-elfvsb/elfvsb.exp LOCAL/src/ld/testsuite/ld-elfvsb/elfvsb.exp
--- ORIG/src/ld/testsuite/ld-elfvsb/elfvsb.exp	Wed Apr 30 12:21:50 2003
+++ LOCAL/src/ld/testsuite/ld-elfvsb/elfvsb.exp	Wed May  7 18:35:37 2003
@@ -37,7 +37,8 @@ if { ![istarget hppa*64*-*-hpux*] \
      && ![istarget alpha*-*-linux*] \
      && ![istarget sparc*-*-linux*] \
      && ![istarget s390*-*-linux*] \
-     && ![istarget x86_64-*-linux*] } {
+     && ![istarget x86_64-*-linux*] \
+     && ![istarget sh\[34\]*-*-linux*] } {
     return
 }
 
diff -u3prN ORIG/src/ld/testsuite/ld-elfweak/elfweak.exp LOCAL/src/ld/testsuite/ld-elfweak/elfweak.exp
--- ORIG/src/ld/testsuite/ld-elfweak/elfweak.exp	Tue May  6 22:39:03 2003
+++ LOCAL/src/ld/testsuite/ld-elfweak/elfweak.exp	Wed May  7 18:36:21 2003
@@ -43,7 +43,8 @@ if { ![istarget hppa*64*-*-hpux*] \
      && ![istarget sparc*-*-linux*] \
      && ![istarget arm*-*-linux*] \
      && ![istarget mips*-*-linux*] \
-     && ![istarget alpha*-*-linux*] } {
+     && ![istarget alpha*-*-linux*] \
+     && ![istarget sh\[34\]*-*-linux*] } {
     return
 }
 



More information about the Binutils mailing list