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: --gc-sections leads to relocation truncated to fit: R_PPC64_REL24 against .opd +$bignum


On Sun, Jun 05, 2005 at 10:15:19PM +0200, Olaf Hering wrote:
> Is --gc-sections supposed to work correctly?

Sigh.  Yes, it is supposed to..  Non-dotsym compilers exposed a bug in
gc_mark_hook, and broke --no-opd-optimize too.  It's a wonder Jakub
hadn't complained to me about this one.

bfd/
	* elf64-pcc.c (ppc64_elf_gc_mark_hook): For the local sym in .opd
	case, include addend when indexing .opd section map.
	(ppc64_elf_edit_opd): Add no_opd_opt param.  Do nothing besides
	clear opd_adjust array if no_opd_opt set.  Tidy code.
	* elf64-ppc.h (ppc64_elf_edit_opd): Update prototype.
ld/
	* emultempl/ppc64elf.em (ppc_before_allocation): Always run
	ppc64_elf_edit_opd.

Index: bfd/elf64-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-ppc.c,v
retrieving revision 1.208
diff -u -p -r1.208 elf64-ppc.c
--- bfd/elf64-ppc.c	2 Jun 2005 13:13:54 -0000	1.208
+++ bfd/elf64-ppc.c	6 Jun 2005 12:31:56 -0000
@@ -5064,7 +5064,7 @@ ppc64_elf_gc_mark_hook (asection *sec,
 	  if (!rsec->gc_mark)
 	    _bfd_elf_gc_mark (info, rsec, ppc64_elf_gc_mark_hook);
 
-	  rsec = opd_sym_section[sym->st_value / 8];
+	  rsec = opd_sym_section[(sym->st_value + rel->r_addend) / 8];
 	}
     }
 
@@ -6155,6 +6155,7 @@ dec_dynrel_count (bfd_vma r_info,
 
 bfd_boolean
 ppc64_elf_edit_opd (bfd *obfd, struct bfd_link_info *info,
+		    bfd_boolean no_opd_opt,
 		    bfd_boolean non_overlapping)
 {
   bfd *ibfd;
@@ -6184,11 +6185,14 @@ ppc64_elf_edit_opd (bfd *obfd, struct bf
 	{
 	  /* check_relocs hasn't been called.  Must be a ld -r link
 	     or --just-symbols object.   */
-	  opd_adjust = bfd_zalloc (obfd, amt);
+	  opd_adjust = bfd_alloc (obfd, amt);
 	  ppc64_elf_section_data (sec)->opd.adjust = opd_adjust;
 	}
       memset (opd_adjust, 0, amt);
 
+      if (no_opd_opt)
+	continue;
+
       if (sec->sec_info_type == ELF_INFO_TYPE_JUST_SYMS)
 	continue;
 
@@ -6358,18 +6362,16 @@ ppc64_elf_edit_opd (bfd *obfd, struct bf
 
 	  elf_section_data (sec)->relocs = relstart;
 
-	  wptr = sec->contents;
-	  rptr = sec->contents;
 	  new_contents = sec->contents;
-
 	  if (add_aux_fields)
 	    {
 	      new_contents = bfd_malloc (sec->size + cnt_16b * 8);
 	      if (new_contents == NULL)
 		return FALSE;
 	      need_pad = FALSE;
-	      wptr = new_contents;
 	    }
+	  wptr = new_contents;
+	  rptr = sec->contents;
 
 	  write_rel = relstart;
 	  skip = FALSE;
Index: bfd/elf64-ppc.h
===================================================================
RCS file: /cvs/src/src/bfd/elf64-ppc.h,v
retrieving revision 1.22
diff -u -p -r1.22 elf64-ppc.h
--- bfd/elf64-ppc.h	4 May 2005 15:53:26 -0000	1.22
+++ bfd/elf64-ppc.h	6 Jun 2005 12:42:58 -0000
@@ -20,7 +20,7 @@ Foundation, Inc., 51 Franklin Street - F
 void ppc64_elf_init_stub_bfd
   (bfd *, struct bfd_link_info *);
 bfd_boolean ppc64_elf_edit_opd
-  (bfd *, struct bfd_link_info *, bfd_boolean);
+  (bfd *, struct bfd_link_info *, bfd_boolean, bfd_boolean);
 asection *ppc64_elf_tls_setup
   (bfd *, struct bfd_link_info *);
 bfd_boolean ppc64_elf_tls_optimize
Index: ld/emultempl/ppc64elf.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/ppc64elf.em,v
retrieving revision 1.43
diff -u -p -r1.43 ppc64elf.em
--- ld/emultempl/ppc64elf.em	12 May 2005 07:32:04 -0000	1.43
+++ ld/emultempl/ppc64elf.em	6 Jun 2005 12:44:32 -0000
@@ -102,8 +102,8 @@ ppc_before_allocation (void)
 {
   if (stub_file != NULL)
     {
-      if (!no_opd_opt
-	  && !ppc64_elf_edit_opd (output_bfd, &link_info, non_overlapping_opd))
+      if (!ppc64_elf_edit_opd (output_bfd, &link_info, no_opd_opt,
+			       non_overlapping_opd))
 	einfo ("%X%P: can not edit %s %E\n", "opd");
 
       if (ppc64_elf_tls_setup (output_bfd, &link_info) && !no_tls_opt)

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