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]

Fix for cris-* regressions with "PATCH: PR ld/13177"


> Date: Fri, 16 Sep 2011 09:24:22 -0700
> From: "H.J. Lu" <hjl.tools@gmail.com>

> > cris-elf:
> > Running /tmp/hpautotest-binutils/bsrc/src/ld/testsuite/ld-cris/cris.exp ...
> > FAIL: ld-cris/pic-gc-72
> >
> > ld.log:
> > Executing on host: sh -c {/tmp/hpautotest-binutils/cris-axis-elf/ld/../binutils/objdump ?-s -t -R -p -T tmpdir/dump > tmpdir/dump.out 2>ld.tmp} ?/dev/null ?(timeout = 300)
> > exited abnormally with 0, output:BFD: tmpdir/dump(.rela.dyn): relocation 0 has invalid symbol index 16777215
> >
> > ...
> 
> The problem is cris backend doesn't use plt.refcount nor got.refcount.

Wrong, it does, modulo bugs of course.  The problem is "just"
mismatching bookkeeping between cris_elf_gc_sweep_hook and
cris_elf_check_relocs.  Fixed thus, committed.

Yuck for that bookkeeping; a generally error-prone machinery.
There has to be a better way to "count down".  Something like
registering the "increment" for each reloc and then just apply a
general method without having to inspect the reloc and the
related symbol?  (Who said "C++"? :-)

Tristan, ok for 2.22 as well?  What's policy there; are
target-specific fixes up to target maintainers or is explicit
approval required for that too?

bfd:
	* elf32-cris.c (cris_elf_gc_sweep_hook) <R_CRIS_16_GOTPLT>
	<R_CRIS_32_GOTPLT>: Fix missing update of gotplt refcount for
	global symbols.
	<R_CRIS_8, R_CRIS_16, R_CRIS_32>: New cases for similar missing
	updates of the plt refcount.
	(elf_cris_adjust_gotplt_to_got): Assert integrity of the gotplt
	refcount in relation to the plt refcount.

Index: elf32-cris.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-cris.c,v
retrieving revision 1.115
diff -p -u -r1.115 elf32-cris.c
--- elf32-cris.c	13 Jun 2011 00:59:10 -0000	1.115
+++ elf32-cris.c	14 Oct 2011 06:43:36 -0000
@@ -2663,6 +2663,9 @@ cris_elf_gc_sweep_hook (bfd *abfd,
 	  /* For local symbols, treat these like GOT relocs.  */
 	  if (h == NULL)
 	    goto local_got_reloc;
+	  else
+	    /* For global symbols, adjust the reloc-specific refcount.  */
+	    elf_cris_hash_entry (h)->gotplt_refcount--;
 	  /* Fall through.  */
 
 	case R_CRIS_32_PLT_GOTREL:
@@ -2671,10 +2674,14 @@ cris_elf_gc_sweep_hook (bfd *abfd,
 	    local_got_refcounts[-1]--;
 	  /* Fall through.  */
 
+	case R_CRIS_8:
+	case R_CRIS_16:
+	case R_CRIS_32:
 	case R_CRIS_8_PCREL:
 	case R_CRIS_16_PCREL:
 	case R_CRIS_32_PCREL:
 	case R_CRIS_32_PLT_PCREL:
+	  /* Negate the increment we did in cris_elf_check_relocs.  */
 	  if (h != NULL)
 	    {
 	      if (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
@@ -2733,6 +2740,11 @@ elf_cris_adjust_gotplt_to_got (h, p)
 {
   struct bfd_link_info *info = (struct bfd_link_info *) p;
 
+  /* A GOTPLT reloc, when activated, is supposed to be included into
+     the PLT refcount.  */
+  BFD_ASSERT (h->gotplt_refcount == 0
+	      || h->gotplt_refcount <= h->root.plt.refcount);
+
   /* If nobody wanted a GOTPLT with this symbol, we're done.  */
   if (h->gotplt_refcount <= 0)
     return TRUE;


ld/testsuite:

	* ld-cris/pic-gc-72.d: Adjust for dropping unused undefined
	dynamic symbol "dsofn".

Index: ld-cris/pic-gc-72.d
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-cris/pic-gc-72.d,v
retrieving revision 1.1
diff -p -u -r1.1 pic-gc-72.d
--- ld-cris/pic-gc-72.d	25 Nov 2008 04:10:47 -0000	1.1
+++ ld-cris/pic-gc-72.d	14 Oct 2011 06:41:41 -0000
@@ -19,10 +19,11 @@ Contents of section .dynsym:
 Contents of section .dynstr:
 #...
 Contents of section .text:
- 0188 0f050f05                             .*
+ 016e 0f050f05                             .*
 Contents of section .dynamic:
+ 2174 .*
 #...
 Contents of section .got:
- 21e4 8c210000 00000000 00000000           .*
+ 21cc 74210000 00000000 00000000           .*
 Contents of section .data:
- 21f0 00000000                             .*
+ 21d8 00000000                             .*

brgds, H-P


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