public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 1/1] Don't convert R_SPARC_32 to R_SPARC_RELATIVE if class is ELFCLASS64
  2016-05-11 10:11 [PATCH 0/1] Don't convert R_SPARC_32 to R_SPARC_RELATIVE if class is ELFCLASS64 James Clarke
@ 2016-05-11 10:11 ` James Clarke
  2016-05-24 19:27   ` Cary Coutant
  2016-05-25 14:40   ` Nick Clifton
  0 siblings, 2 replies; 7+ messages in thread
From: James Clarke @ 2016-05-11 10:11 UTC (permalink / raw)
  To: binutils; +Cc: James Clarke

bfd/
 * elfxx-sparc.c (_bfd_sparc_elf_relocate_section): Don't convert
 R_SPARC_32 to R_SPARC_RELATIVE if class is ELFCLASS64.

gold/
 * sparc.cc (Target_sparc::Scan::local): Don't convert R_SPARC_32 to
 R_SPARC_RELATIVE if class is ELFCLASS64.
 (Target_sparc::Scan::global): Likewise.
---
 bfd/elfxx-sparc.c |  3 ++-
 gold/sparc.cc     | 12 +++++++-----
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/bfd/elfxx-sparc.c b/bfd/elfxx-sparc.c
index fc12805..db2d127 100644
--- a/bfd/elfxx-sparc.c
+++ b/bfd/elfxx-sparc.c
@@ -3481,7 +3481,8 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd,
 		}
 	      else
 		{
-		  if (r_type == R_SPARC_32 || r_type == R_SPARC_64)
+		  if ((!ABI_64_P (output_bfd) && r_type == R_SPARC_32)
+		      || (ABI_64_P (output_bfd) && r_type == R_SPARC_64))
 		    {
 		      outrel.r_info = SPARC_ELF_R_INFO (htab, NULL,
 							0, R_SPARC_RELATIVE);
diff --git a/gold/sparc.cc b/gold/sparc.cc
index 10a5031..e5e0146 100644
--- a/gold/sparc.cc
+++ b/gold/sparc.cc
@@ -2292,7 +2292,9 @@ Target_sparc<size, big_endian>::Scan::local(
       // apply the link-time value, so we flag the location with
       // an R_SPARC_RELATIVE relocation so the dynamic loader can
       // relocate it easily.
-      if (parameters->options().output_is_position_independent())
+      if (parameters->options().output_is_position_independent()
+	  && ((size == 64 && r_type == elfcpp::R_SPARC_64)
+	      || (size == 32 && r_type == elfcpp::R_SPARC_32)))
 	{
 	  Reloc_section* rela_dyn = target->rela_dyn_section(layout);
 	  unsigned int r_sym = elfcpp::elf_r_sym<size>(reloc.get_r_info());
@@ -2300,9 +2302,9 @@ Target_sparc<size, big_endian>::Scan::local(
 				       output_section, data_shndx,
 				       reloc.get_r_offset(),
 				       reloc.get_r_addend(), is_ifunc);
+	  break;
 	}
-      break;
-
+      /* Fall through */
     case elfcpp::R_SPARC_HIX22:
     case elfcpp::R_SPARC_LOX10:
     case elfcpp::R_SPARC_H34:
@@ -2766,8 +2768,8 @@ Target_sparc<size, big_endian>::Scan::global(
 						       reloc.get_r_offset(),
 						       reloc.get_r_addend());
 	      }
-	    else if ((r_type == elfcpp::R_SPARC_32
-		      || r_type == elfcpp::R_SPARC_64)
+	    else if (((size == 64 && r_type == elfcpp::R_SPARC_64)
+		      || (size == 32 && r_type == elfcpp::R_SPARC_32))
 		     && gsym->can_use_relative_reloc(false))
 	      {
 		Reloc_section* rela_dyn = target->rela_dyn_section(layout);
-- 
2.8.2

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 0/1] Don't convert R_SPARC_32 to R_SPARC_RELATIVE if class is ELFCLASS64
@ 2016-05-11 10:11 James Clarke
  2016-05-11 10:11 ` [PATCH 1/1] " James Clarke
  0 siblings, 1 reply; 7+ messages in thread
From: James Clarke @ 2016-05-11 10:11 UTC (permalink / raw)
  To: binutils; +Cc: James Clarke

Currently, ld (both bfd and gold) will convert an R_SPARC_32 relocation to be
an R_SPARC_RELATIVE one when creating an ELFCLASS64 file (and would convert
R_SPARC_64 to R_SPARC_RELATIVE for an ELFCLASS32 file if it were to be given
such a relocation). This is clearly incorrect based on the size and alignment
requirements for each. This patch ensures R_SPARC_XX is only converted to
R_SPARC_RELATIVE when creating an ELFCLASSXX file.

This seems to produce a regression in the test suite for -Bsymbolic-functions:

    /home/jrtc27/src/binutils/binutils-2.26/builddir-single/ld/../gas/as-new   -I/home/jrtc27/src/binutils/binutils-2.26/ld/testsuite/ld-elf   -o tmpdir/symbolic-func.o  /home/jrtc27/src/binutils/binutils-2.26/ld/testsuite/ld-elf/symbolic-fun
    c.s
    Executing on host: sh -c {/home/jrtc27/src/binutils/binutils-2.26/builddir-single/ld/../gas/as-new   -I/home/jrtc27/src/binutils/binutils-2.26/ld/testsuite/ld-elf   -o tmpdir/symbolic-func.o  /home/jrtc27/src/binutils/binutils-2.26/ld/tes
    tsuite/ld-elf/symbolic-func.s 2>&1}  /dev/null ld.tmp (timeout = 300)
    spawn [open ...]
    /home/jrtc27/src/binutils/binutils-2.26/builddir-single/ld/ld-new   -o tmpdir/symbolic-func.so -L/home/jrtc27/src/binutils/binutils-2.26/ld/testsuite/ld-elf -shared -Bsymbolic-functions tmpdir/symbolic-func.o 
    Executing on host: sh -c {/home/jrtc27/src/binutils/binutils-2.26/builddir-single/ld/ld-new   -o tmpdir/symbolic-func.so -L/home/jrtc27/src/binutils/binutils-2.26/ld/testsuite/ld-elf -shared -Bsymbolic-functions tmpdir/symbolic-func.o  2>
    &1}  /dev/null ld.tmp (timeout = 300)
    spawn [open ...]
    Executing on host: sh -c {/home/jrtc27/src/binutils/binutils-2.26/builddir-single/ld/../binutils/readelf -r --wide tmpdir/symbolic-func.so >dump.out 2>ld.stderr}  /dev/null  (timeout = 300)
    spawn [open ...]
    /home/jrtc27/src/binutils/binutils-2.26/builddir-single/ld/../binutils/readelf -r --wide tmpdir/symbolic-func.so
    regexp_diff match failure
    regexp "^0*[1-9a-f][0-9a-f]* +[^ ]+ +[^ ]+ +([0-9a-f]+( +\.text( \+ 0)?)?)?$"
    line   "0000000000100200  0000000100000003 R_SPARC_32             00000000000001f8 .text + 1f8"
    FAIL: -Bsymbolic-functions

Linking symbolic-func.so with system linker:

    Relocation section '.rela.dyn' at offset 0x1e0 contains 1 entries:
      Offset          Info           Type           Sym. Value    Sym. Name + Addend
    000000100200  000000000016 R_SPARC_RELATIVE                     1f8

Linking symbolic-func.so with new linker:

    Relocation section '.rela.dyn' at offset 0x1e0 contains 1 entries:
      Offset          Info           Type           Sym. Value    Sym. Name + Addend
    000000100200  000100000003 R_SPARC_32        00000000000001f8 .text + 1f8

I don't know what's supposed to happen here, but I would be very surprised if
the R_SPARC_32 is meant to be an R_SPARC_RELATIVE given the sizes and alignment
requirements.

Note: this bug appeared in 22b75d0ae688dadd85f4bf89bd14541f9c9c6f2c, which
created elfxx-sparc.c and unified the code in elf{32,64}-sparc.c.

James Clarke (1):
  Don't convert R_SPARC_32 to R_SPARC_RELATIVE if class is ELFCLASS64

 bfd/elfxx-sparc.c |  3 ++-
 gold/sparc.cc     | 12 +++++++-----
 2 files changed, 9 insertions(+), 6 deletions(-)

-- 
2.8.2

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/1] Don't convert R_SPARC_32 to R_SPARC_RELATIVE if class is ELFCLASS64
  2016-05-11 10:11 ` [PATCH 1/1] " James Clarke
@ 2016-05-24 19:27   ` Cary Coutant
  2016-06-27 22:13     ` James Clarke
  2016-05-25 14:40   ` Nick Clifton
  1 sibling, 1 reply; 7+ messages in thread
From: Cary Coutant @ 2016-05-24 19:27 UTC (permalink / raw)
  To: James Clarke; +Cc: Binutils

> gold/
>  * sparc.cc (Target_sparc::Scan::local): Don't convert R_SPARC_32 to
>  R_SPARC_RELATIVE if class is ELFCLASS64.
>  (Target_sparc::Scan::global): Likewise.

The gold part of this patch is OK.

(Sorry for the delay. The patch wasn't addressed to me, and it didn't
have [gold] in the subject, so I didn't see this until today.)

-cary

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/1] Don't convert R_SPARC_32 to R_SPARC_RELATIVE if class is ELFCLASS64
  2016-05-11 10:11 ` [PATCH 1/1] " James Clarke
  2016-05-24 19:27   ` Cary Coutant
@ 2016-05-25 14:40   ` Nick Clifton
  1 sibling, 0 replies; 7+ messages in thread
From: Nick Clifton @ 2016-05-25 14:40 UTC (permalink / raw)
  To: James Clarke, binutils

Hi James,

> bfd/
>  * elfxx-sparc.c (_bfd_sparc_elf_relocate_section): Don't convert
>  R_SPARC_32 to R_SPARC_RELATIVE if class is ELFCLASS64.

This part is approved too.

The failure of the -Bsymbolic functions linker test looks, to me,
like a problem with the regexp.  Specifically I think that it may
need to accept tabs as well as spaces where there is whitespace
between parts of readelf's output.

Cheers
  Nick

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/1] Don't convert R_SPARC_32 to R_SPARC_RELATIVE if class is ELFCLASS64
  2016-05-24 19:27   ` Cary Coutant
@ 2016-06-27 22:13     ` James Clarke
  2016-06-28 11:03       ` Nick Clifton
  0 siblings, 1 reply; 7+ messages in thread
From: James Clarke @ 2016-06-27 22:13 UTC (permalink / raw)
  To: Cary Coutant, Nick Clifton; +Cc: binutils, debian-sparc

Hi,
On Tue, May 24, 2016 at 20:26:58PM +0100, Cary Coutant wrote:
> > gold/
> >  * sparc.cc (Target_sparc::Scan::local): Don't convert R_SPARC_32 to
> >  R_SPARC_RELATIVE if class is ELFCLASS64.
> >  (Target_sparc::Scan::global): Likewise.
>
> The gold part of this patch is OK.

On Wed, May 25, 2016 at 03:40:32PM +0100, Nick Clifton wrote:
> > bfd/
> >  * elfxx-sparc.c (_bfd_sparc_elf_relocate_section): Don't convert
> >  R_SPARC_32 to R_SPARC_RELATIVE if class is ELFCLASS64.
>
> This part is approved too.

Any progress on this? It would be good to get this fixed properly. I
know gold segfaults when building one particular package with the gold
part of the patch applied (although I haven't tried it without) but at
least getting just bfd fixed would be an improvement.

Regards,
James

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/1] Don't convert R_SPARC_32 to R_SPARC_RELATIVE if class is ELFCLASS64
  2016-06-27 22:13     ` James Clarke
@ 2016-06-28 11:03       ` Nick Clifton
  2016-06-28 11:22         ` John Paul Adrian Glaubitz
  0 siblings, 1 reply; 7+ messages in thread
From: Nick Clifton @ 2016-06-28 11:03 UTC (permalink / raw)
  To: James Clarke, Cary Coutant; +Cc: binutils, debian-sparc

Hi James,

> Any progress on this? It would be good to get this fixed properly. I
> know gold segfaults when building one particular package with the gold
> part of the patch applied (although I haven't tried it without) but at
> least getting just bfd fixed would be an improvement.

Sorry about that - the patch is now checked in.

Cheers
  Nick

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/1] Don't convert R_SPARC_32 to R_SPARC_RELATIVE if class is ELFCLASS64
  2016-06-28 11:03       ` Nick Clifton
@ 2016-06-28 11:22         ` John Paul Adrian Glaubitz
  0 siblings, 0 replies; 7+ messages in thread
From: John Paul Adrian Glaubitz @ 2016-06-28 11:22 UTC (permalink / raw)
  To: Nick Clifton, James Clarke, Cary Coutant; +Cc: binutils, debian-sparc

On 06/28/2016 01:02 PM, Nick Clifton wrote:
>> Any progress on this? It would be good to get this fixed properly. I
>> know gold segfaults when building one particular package with the gold
>> part of the patch applied (although I haven't tried it without) but at
>> least getting just bfd fixed would be an improvement.
> 
> Sorry about that - the patch is now checked in.

Awesome, thank you very much!

@James: Now we just need to track down the Gold crashes.

Adrian

-- 
 .''`.  John Paul Adrian Glaubitz
: :' :  Debian Developer - glaubitz@debian.org
`. `'   Freie Universitaet Berlin - glaubitz@physik.fu-berlin.de
  `-    GPG: 62FF 8A75 84E0 2956 9546  0006 7426 3B37 F5B5 F913

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2016-06-28 11:22 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-05-11 10:11 [PATCH 0/1] Don't convert R_SPARC_32 to R_SPARC_RELATIVE if class is ELFCLASS64 James Clarke
2016-05-11 10:11 ` [PATCH 1/1] " James Clarke
2016-05-24 19:27   ` Cary Coutant
2016-06-27 22:13     ` James Clarke
2016-06-28 11:03       ` Nick Clifton
2016-06-28 11:22         ` John Paul Adrian Glaubitz
2016-05-25 14:40   ` Nick Clifton

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).