This is the mail archive of the binutils@sources.redhat.com 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]

Re: ppc32 broken with cvs head


On Wed, Mar 05, 2003 at 06:54:45PM +0100, Olaf Hering wrote:
> unresolvable relocation against symbol `environ@@GLIBC_2.0'

A testcase for this is

cat > env.c <<EOF
extern char *environ;
int main (void) { return *environ; }
EOF
gcc -o env env.c -fPIC -O

The quick fix is to "#define ELIMINATE_COPY_RELOCS 0" at
elf32-ppc.c:2458.  I'm afraid the ELIMINATE_COPY_RELOCS code is
broken, and has been broken on x86 for a long time too.  In fact,
it's quite surprising that no one has reported a bug in the x86
code.  Maybe it's just harder to trigger there.

I'll work on a more comprehensive fix soon.  Meanwhile the following
will fix the problem, and tidy a few other small things.

	* elf32-ppc.c (ppc_elf_create_linker_section): Don't capitalize
	error messages.
	(ELIMINATE_COPY_RELOCS): Define to zero.
	(ppc_elf_relocate_section): Don't deref htab->tls_sec when calculating
	TLSLD relocs.  Report reloc types on a number of errors.  Optimize
	LOCAL24PC check for non-local syms.  Don't capitalize error messages.
	* elf64-ppc.c (ELIMINATE_COPY_RELOCS): Define to zero.
	(ppc64_elf_relocate_section): Don't deref htab->tls_sec when
	calculating TLSLD relocs.  Report reloc types on a number of errors.
	Don't capitalize error messages.

Index: bfd/elf32-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-ppc.c,v
retrieving revision 1.68
diff -u -p -r1.68 elf32-ppc.c
--- bfd/elf32-ppc.c	20 Feb 2003 09:10:18 -0000	1.68
+++ bfd/elf32-ppc.c	6 Mar 2003 11:14:19 -0000
@@ -2300,7 +2300,7 @@ ppc_elf_create_linker_section (abfd, inf
       switch (which)
 	{
 	default:
-	  (*_bfd_error_handler) (_("%s: Unknown special linker type %d"),
+	  (*_bfd_error_handler) (_("%s: unknown special linker type %d"),
 				 bfd_get_filename (abfd),
 				 (int) which);
 
@@ -2455,7 +2455,7 @@ ppc_elf_create_dynamic_sections (abfd, i
    copying dynamic variables from a shared lib into an app's dynbss
    section, and instead use a dynamic relocation to point into the
    shared lib.  */
-#define ELIMINATE_COPY_RELOCS 1
+#define ELIMINATE_COPY_RELOCS 0
 
 /* Adjust a symbol defined by a dynamic object and referenced by a
    regular object.  The current definition is in some section of the
@@ -4824,22 +4824,21 @@ ppc_elf_relocate_section (output_bfd, in
 		      {
 			bfd_vma value = relocation;
 
-			if ((tls_ty & (TLS_GD | TLS_TPREL | TLS_DTPREL
-				       | TLS_TPRELGD)) != 0)
+			if (tls_ty == (TLS_TLS | TLS_LD))
+			  value = 1;
+			else if (tls_ty != 0)
 			  {
 			    value -= htab->tls_sec->vma + DTP_OFFSET;
-			    if ((tls_ty & TLS_TPREL) != 0)
+			    if (tls_ty == (TLS_TLS | TLS_TPREL))
 			      value += DTP_OFFSET - TP_OFFSET;
-			  }
 
-			if (tls_ty == (TLS_TLS | TLS_GD))
-			  {
-			    bfd_put_32 (output_bfd, value,
-					htab->got->contents + off + 4);
-			    value = 1;
+			    if (tls_ty == (TLS_TLS | TLS_GD))
+			      {
+				bfd_put_32 (output_bfd, value,
+					    htab->got->contents + off + 4);
+				value = 1;
+			      }
 			  }
-			else if (tls_ty == (TLS_TLS | TLS_LD))
-			  value = 1;
 			bfd_put_32 (output_bfd, value,
 				    htab->got->contents + off);
 		      }
@@ -4887,10 +4886,11 @@ ppc_elf_relocate_section (output_bfd, in
 	       got at entry m+n bears little relation to the entry m.  */
 	    if (addend != 0)
 	      (*_bfd_error_handler)
-		(_("%s(%s+0x%lx): non-zero addend on got reloc against `%s'"),
+		(_("%s(%s+0x%lx): non-zero addend on %s reloc against `%s'"),
 		 bfd_archive_filename (input_bfd),
 		 bfd_get_section_name (input_bfd, input_section),
 		 (long) rel->r_offset,
+		 howto->name,
 		 sym_name);
 	  }
 	break;
@@ -4899,10 +4899,7 @@ ppc_elf_relocate_section (output_bfd, in
 	case R_PPC_LOCAL24PC:
 	  /* It makes no sense to point a local relocation
 	     at a symbol not in this object.  */
-	  if (h != NULL
-	      && (h->root.type == bfd_link_hash_defined
-		  || h->root.type == bfd_link_hash_defweak)
-	      && sec->output_section == NULL)
+	  if (unresolved_reloc)
 	    {
 	      if (! (*info->callbacks->undefined_symbol) (info,
 							  h->root.root.string,
@@ -5037,8 +5034,6 @@ ppc_elf_relocate_section (output_bfd, in
 
 	      if (skip)
 		memset (&outrel, 0, sizeof outrel);
-	      /* h->dynindx may be -1 if this symbol was marked to
-		 become local.  */
 	      else if (h != NULL
 		       && !SYMBOL_REFERENCES_LOCAL (info, h))
 		{
@@ -5175,7 +5170,7 @@ ppc_elf_relocate_section (output_bfd, in
 		   || (strncmp (name, ".sbss", 5) == 0
 		       && (name[5] == 0 || name[5] == '.'))))
 	      {
-		(*_bfd_error_handler) (_("%s: The target (%s) of a %s relocation is in the wrong output section (%s)"),
+		(*_bfd_error_handler) (_("%s: the target (%s) of a %s relocation is in the wrong output section (%s)"),
 				       bfd_archive_filename (input_bfd),
 				       sym_name,
 				       howto->name,
@@ -5199,7 +5194,7 @@ ppc_elf_relocate_section (output_bfd, in
 	    if (! (strncmp (name, ".sdata2", 7) == 0
 		   || strncmp (name, ".sbss2", 6) == 0))
 	      {
-		(*_bfd_error_handler) (_("%s: The target (%s) of a %s relocation is in the wrong output section (%s)"),
+		(*_bfd_error_handler) (_("%s: the target (%s) of a %s relocation is in the wrong output section (%s)"),
 				       bfd_archive_filename (input_bfd),
 				       sym_name,
 				       howto->name,
@@ -5256,7 +5251,7 @@ ppc_elf_relocate_section (output_bfd, in
 
 	    else
 	      {
-		(*_bfd_error_handler) (_("%s: The target (%s) of a %s relocation is in the wrong output section (%s)"),
+		(*_bfd_error_handler) (_("%s: the target (%s) of a %s relocation is in the wrong output section (%s)"),
 				       bfd_archive_filename (input_bfd),
 				       sym_name,
 				       howto->name,
@@ -5310,7 +5305,7 @@ ppc_elf_relocate_section (output_bfd, in
 	case R_PPC_EMB_RELST_HA:
 	case R_PPC_EMB_BIT_FLD:
 	  (*_bfd_error_handler)
-	    (_("%s: Relocation %s is not yet supported for symbol %s."),
+	    (_("%s: relocation %s is not yet supported for symbol %s."),
 	     bfd_archive_filename (input_bfd),
 	     howto->name,
 	     sym_name);
@@ -5339,7 +5334,7 @@ ppc_elf_relocate_section (output_bfd, in
 	case R_PPC_EMB_NADDR16_HA:
 	case R_PPC_EMB_RELST_HA:
 	  /* It's just possible that this symbol is a weak symbol
-	     that's not actually defined anywhere. In that case,
+	     that's not actually defined anywhere.  In that case,
 	     'sec' would be NULL, and we should leave the symbol
 	     alone (it will be set to zero elsewhere in the link).  */
 	  if (sec != NULL)
@@ -5363,10 +5358,11 @@ ppc_elf_relocate_section (output_bfd, in
 	       && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
 	{
 	  (*_bfd_error_handler)
-	    (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"),
+	    (_("%s(%s+0x%lx): unresolvable %s relocation against symbol `%s'"),
 	     bfd_archive_filename (input_bfd),
 	     bfd_get_section_name (input_bfd, input_section),
 	     (long) rel->r_offset,
+	     howto->name,
 	     sym_name);
 	  ret = FALSE;
 	}
@@ -5412,10 +5408,10 @@ ppc_elf_relocate_section (output_bfd, in
 	  else
 	    {
 	      (*_bfd_error_handler)
-		(_("%s(%s+0x%lx): reloc against `%s': error %d"),
+		(_("%s(%s+0x%lx): %s reloc against `%s': error %d"),
 		 bfd_archive_filename (input_bfd),
 		 bfd_get_section_name (input_bfd, input_section),
-		 (long) rel->r_offset, sym_name, (int) r);
+		 (long) rel->r_offset, howto->name, sym_name, (int) r);
 	      ret = FALSE;
 	    }
 	}
Index: bfd/elf64-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-ppc.c,v
retrieving revision 1.89
diff -u -p -r1.89 elf64-ppc.c
--- bfd/elf64-ppc.c	19 Feb 2003 11:44:15 -0000	1.89
+++ bfd/elf64-ppc.c	6 Mar 2003 11:27:04 -0000
@@ -2545,7 +2545,7 @@ struct plt_entry
    copying dynamic variables from a shared lib into an app's dynbss
    section, and instead use a dynamic relocation to point into the
    shared lib.  */
-#define ELIMINATE_COPY_RELOCS 1
+#define ELIMINATE_COPY_RELOCS 0
 
 /* Section name for stubs is the associated section name plus this
    string.  */
@@ -7670,21 +7670,22 @@ ppc64_elf_relocate_section (output_bfd, 
 		else
 		  {
 		    relocation += rel->r_addend;
-		    if (tls_type != 0)
+		    if (tls_type == (TLS_TLS | TLS_LD))
+		      relocation = 1;
+		    else if (tls_type != 0)
 		      {
 			relocation -= htab->tls_sec->vma + DTP_OFFSET;
-			if ((tls_type & TLS_TPREL) != 0)
+			if (tls_type == (TLS_TLS | TLS_TPREL))
 			  relocation += DTP_OFFSET - TP_OFFSET;
-		      }
 
-		    if ((tls_type & TLS_GD) != 0)
-		      {
-			bfd_put_64 (output_bfd, relocation,
-				    htab->sgot->contents + off + 8);
-			relocation = 1;
+			if (tls_type == (TLS_TLS | TLS_GD))
+			  {
+			    bfd_put_64 (output_bfd, relocation,
+					htab->sgot->contents + off + 8);
+			    relocation = 1;
+			  }
 		      }
-		    else if (tls_type == (TLS_TLS | TLS_LD))
-		      relocation = 1;
+
 		    bfd_put_64 (output_bfd, relocation,
 				htab->sgot->contents + off);
 		  }
@@ -7981,7 +7982,7 @@ ppc64_elf_relocate_section (output_bfd, 
 	  /* These ones haven't been implemented yet.  */
 
 	  (*_bfd_error_handler)
-	    (_("%s: Relocation %s is not supported for symbol %s."),
+	    (_("%s: relocation %s is not supported for symbol %s."),
 	     bfd_archive_filename (input_bfd),
 	     ppc64_elf_howto_table[(int) r_type]->name, sym_name);
 
@@ -8095,10 +8096,11 @@ ppc64_elf_relocate_section (output_bfd, 
 	       && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
 	{
 	  (*_bfd_error_handler)
-	    (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"),
+	    (_("%s(%s+0x%lx): unresolvable %s relocation against symbol `%s'"),
 	     bfd_archive_filename (input_bfd),
 	     bfd_get_section_name (input_bfd, input_section),
 	     (long) rel->r_offset,
+	     ppc64_elf_howto_table[(int) r_type]->name,
 	     h->root.root.string);
 	  ret = FALSE;
 	}
@@ -8140,10 +8142,13 @@ ppc64_elf_relocate_section (output_bfd, 
 	  else
 	    {
 	      (*_bfd_error_handler)
-		(_("%s(%s+0x%lx): reloc against `%s': error %d"),
+		(_("%s(%s+0x%lx): %s reloc against `%s': error %d"),
 		 bfd_archive_filename (input_bfd),
 		 bfd_get_section_name (input_bfd, input_section),
-		 (long) rel->r_offset, sym_name, (int) r);
+		 (long) rel->r_offset,
+		 ppc64_elf_howto_table[(int) r_type]->name,
+		 sym_name,
+		 (int) r);
 	      ret = FALSE;
 	    }
 	}


-- 
Alan Modra
IBM OzLabs - Linux Technology Centre


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