This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] VAX/ELF: Symbol visibility support


Hello,

 This is a patch to add symbol visibility support to the VAX/ELF backend.  
Changes include attribute recognition in BFD so that GOT or PLT entries 
are not created as expected (unlimited PC-relative addressing is supported 
by VAX for all kinds of memory references, so there is no need for 
run-time relocation of local symbols) as well as a fix to GAS so as to 
permit indirect symbol references which inevitably will be generated for 
some hidden symbols by GCC.  Any errors resulting from the inability to 
route indirect references via the GOT -- which may happen for handcoded 
assembly only -- are already reported by the linker as they should be.

 Regression-tested successfully with the vax-linux target; running 
dynamically-linked `bash' on the target system (about the best native 
testing possible atm) revealed no problems either.

bfd/
2009-06-04  Maciej W. Rozycki  <macro@linux-mips.org>

	* elf32-vax.c (elf_vax_check_relocs): Handle the visibility 
	attribute.
	(elf_vax_relocate_section): Likewise.

gas/
2009-06-04  Maciej W. Rozycki  <macro@linux-mips.org>

	* config/tc-vax.c (md_estimate_size_before_relax): Accept
	indirect symbol references in the PIC mode and emit a
	PC-relative relocation instead of a GOT/PLT one.  Likewise
	for symbols known to be hidden at this point.

 OK to apply?

  Maciej

binutils-2.19.51-20090531-vax-elf-visibility.patch
diff -up --recursive --new-file binutils-2.19.51-20090531.macro/bfd/elf32-vax.c binutils-2.19.51-20090531/bfd/elf32-vax.c
--- binutils-2.19.51-20090531.macro/bfd/elf32-vax.c	2009-04-02 04:25:18.000000000 +0000
+++ binutils-2.19.51-20090531/bfd/elf32-vax.c	2009-06-01 23:23:15.000000000 +0000
@@ -605,6 +605,11 @@ elf_vax_check_relocs (bfd *abfd, struct 
 	      || h == elf_hash_table (info)->hplt)
 	    break;
 
+	  /* If this is a local symbol, we resolve it directly without
+	     creating a global offset table entry.  */
+	  if (h == NULL || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
+	    break;
+
 	  /* This symbol requires a global offset table entry.  */
 
 	  if (dynobj == NULL)
@@ -677,7 +682,7 @@ elf_vax_check_relocs (bfd *abfd, struct 
 	  /* If this is a local symbol, we resolve it directly without
 	     creating a procedure linkage table entry.  */
 	  BFD_ASSERT (h != NULL);
-	  if (h->forced_local)
+	  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT || h->forced_local)
 	    break;
 
 	  h->needs_plt = 1;
@@ -706,7 +711,9 @@ elf_vax_check_relocs (bfd *abfd, struct 
 		&& (!info->symbolic
 		    || !h->def_regular)))
 	    {
-	      if (h != NULL && !h->forced_local)
+	      if (h != NULL
+		  && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
+		  && !h->forced_local)
 		{
 		  /* Make sure a plt entry is created for this symbol if
 		     it turns out to be a function defined by a dynamic
@@ -718,14 +725,17 @@ elf_vax_check_relocs (bfd *abfd, struct 
 		}
 	      break;
 	    }
-	  if (h != NULL && h->forced_local)
+	  /* If this is a local symbol, we can resolve it directly.  */
+	  if (h != NULL
+	      && (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
+		  || h->forced_local))
 	    break;
 
 	  /* Fall through.  */
 	case R_VAX_8:
 	case R_VAX_16:
 	case R_VAX_32:
-	  if (h != NULL)
+	  if (h != NULL && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
 	    {
 	      /* Make sure a plt entry is created for this symbol if it
 		 turns out to be a function defined by a dynamic object.  */
@@ -1465,7 +1475,10 @@ elf_vax_relocate_section (bfd *output_bf
 	case R_VAX_GOT32:
 	  /* Relocation is to the address of the entry for this symbol
 	     in the global offset table.  */
-	  if (h == NULL || h->got.offset == (bfd_vma) -1 || h->forced_local)
+	  if (h == NULL
+	      || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
+	      || h->got.offset == (bfd_vma) -1
+	      || h->forced_local)
 	    break;
 
 	  /* Relocation is the offset of the entry for this symbol in
@@ -1527,7 +1540,9 @@ elf_vax_relocate_section (bfd *output_bf
 
 	  /* Resolve a PLTxx reloc against a local symbol directly,
 	     without using the procedure linkage table.  */
-	  if (h == NULL || h->forced_local)
+	  if (h == NULL
+	      || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
+	      || h->forced_local)
 	    break;
 
 	  if (h->plt.offset == (bfd_vma) -1
@@ -1581,7 +1596,9 @@ elf_vax_relocate_section (bfd *output_bf
 	case R_VAX_PC8:
 	case R_VAX_PC16:
 	case R_VAX_PC32:
-	  if (h == NULL || h->forced_local)
+	  if (h == NULL
+	      || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
+	      || h->forced_local)
 	    break;
 	  /* Fall through.  */
 	case R_VAX_8:
diff -up --recursive --new-file binutils-2.19.51-20090531.macro/gas/config/tc-vax.c binutils-2.19.51-20090531/gas/config/tc-vax.c
--- binutils-2.19.51-20090531.macro/gas/config/tc-vax.c	2009-04-02 04:25:28.000000000 +0000
+++ binutils-2.19.51-20090531/gas/config/tc-vax.c	2009-06-01 23:23:15.000000000 +0000
@@ -396,23 +396,20 @@ md_estimate_size_before_relax (fragS *fr
 	          || S_IS_WEAK (fragP->fr_symbol)
 	          || S_IS_EXTERNAL (fragP->fr_symbol)))
 	    {
-	      if (p[0] & 0x10)
-		{
-		  if (flag_want_pic)
-		    as_fatal ("PIC reference to %s is indirect.\n",
-			      S_GET_NAME (fragP->fr_symbol));
-		}
+	      /* Indirect references cannot go through the GOT or PLT,
+	         let's hope they'll become local in the final link.  */
+	      if ((ELF_ST_VISIBILITY (S_GET_OTHER (fragP->fr_symbol))
+		   != STV_DEFAULT)
+		  || (p[0] & 0x10))
+		reloc_type = BFD_RELOC_32_PCREL;
+	      else if (((unsigned char *) fragP->fr_opcode)[0] == VAX_CALLS
+		       || ((unsigned char *) fragP->fr_opcode)[0] == VAX_CALLG
+		       || ((unsigned char *) fragP->fr_opcode)[0] == VAX_JSB
+		       || ((unsigned char *) fragP->fr_opcode)[0] == VAX_JMP
+		       || S_IS_FUNCTION (fragP->fr_symbol))
+		reloc_type = BFD_RELOC_32_PLT_PCREL;
 	      else
-		{
-		  if (((unsigned char *) fragP->fr_opcode)[0] == VAX_CALLS
-		      || ((unsigned char *) fragP->fr_opcode)[0] == VAX_CALLG
-		      || ((unsigned char *) fragP->fr_opcode)[0] == VAX_JSB
-		      || ((unsigned char *) fragP->fr_opcode)[0] == VAX_JMP
-		      || S_IS_FUNCTION (fragP->fr_symbol))
-		    reloc_type = BFD_RELOC_32_PLT_PCREL;
-		  else
-		    reloc_type = BFD_RELOC_32_GOT_PCREL;
-		}
+		reloc_type = BFD_RELOC_32_GOT_PCREL;
 	    }
 #endif
 	  switch (RELAX_STATE (fragP->fr_subtype))


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]