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]

fix linking of --just-symbols objects for ppc64


When building klibc on powerpc64-linux with a new compiler, ld was
hitting an assert in opd_entry_value and segfaulting shortly after
that.

	* elf64-ppc.c (opd_entry_value): Handle --just-symbols objects.
	(ppc64_elf_edit_opd): Likewise.

Index: bfd/elf64-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-ppc.c,v
retrieving revision 1.175
diff -u -p -r1.175 elf64-ppc.c
--- bfd/elf64-ppc.c	17 Sep 2004 07:14:28 -0000	1.175
+++ bfd/elf64-ppc.c	19 Oct 2004 11:50:05 -0000
@@ -4698,6 +4698,32 @@ opd_entry_value (asection *opd_sec,
   bfd *opd_bfd = opd_sec->owner;
   Elf_Internal_Rela *lo, *hi, *look;
 
+  /* No relocs implies we are linking a --just-symbols object.  */
+  if (opd_sec->reloc_count == 0)
+    {
+      bfd_vma val;
+
+      if (!bfd_get_section_contents (opd_bfd, opd_sec, &val, offset, 8))
+	return (bfd_vma) -1;
+      
+      if (code_sec != NULL)
+	{
+	  asection *sec, *likely = NULL;
+	  for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
+	    if (sec->vma <= val
+		&& (sec->flags & SEC_LOAD) != 0
+		&& (sec->flags & SEC_ALLOC) != 0)
+	      likely = sec;
+	  if (likely != NULL)
+	    {
+	      *code_sec = likely;
+	      if (code_off != NULL)
+		*code_off = val - likely->vma;
+	    }
+	}
+      return val;
+    }
+
   /* Go find the opd reloc at the sym address.  */
   lo = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
   BFD_ASSERT (lo != NULL);
@@ -5899,13 +5925,16 @@ ppc64_elf_edit_opd (bfd *obfd, struct bf
       opd_adjust = get_opd_info (sec);
       if (opd_adjust == NULL)
 	{
-	  /* Must be a ld -r link.  ie. check_relocs hasn't been
-	     called.  */
+	  /* check_relocs hasn't been called.  Must be a ld -r link
+	     or --just-symbols object.   */
 	  opd_adjust = bfd_zalloc (obfd, amt);
 	  ppc64_elf_section_data (sec)->opd.adjust = opd_adjust;
 	}
       memset (opd_adjust, 0, amt);
 
+      if (sec->sec_info_type == ELF_INFO_TYPE_JUST_SYMS)
+	continue;
+
       if (sec->output_section == bfd_abs_section_ptr)
 	continue;
 

-- 
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]