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]

Re: [PATCH] bfd: Fix negative GOT offsets for non-local references on sparc64


Looks good to me.

    bfd/
     * elfxx-sparc.c (_bfd_sparc_elf_relocate_section): Don't convert
     R_SPARC_GOTDATA_OP_HIX22 and R_SPARC_GOTDATA_OP_LOX10 to R_SPARC_GOT*
     for non-local references. Instead, treat them like
     R_SPARC_GOTDATA_HIX22/R_SPARC_GOTDATA_LOX10 when filling in the
     immediate with the calculated relocation.
    ---
     bfd/elfxx-sparc.c | 22 ++++++++++++----------
     1 file changed, 12 insertions(+), 10 deletions(-)
    
    diff --git a/bfd/elfxx-sparc.c b/bfd/elfxx-sparc.c
    index db8058f..e1c7b22 100644
    --- a/bfd/elfxx-sparc.c
    +++ b/bfd/elfxx-sparc.c
    @@ -3164,14 +3164,12 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd,
     	case R_SPARC_GOTDATA_OP_HIX22:
     	case R_SPARC_GOTDATA_OP_LOX10:
     	  if (SYMBOL_REFERENCES_LOCAL (info, h))
    -	    r_type = (r_type == R_SPARC_GOTDATA_OP_HIX22
    -		      ? R_SPARC_GOTDATA_HIX22
    -		      : R_SPARC_GOTDATA_LOX10);
    -	  else
    -	    r_type = (r_type == R_SPARC_GOTDATA_OP_HIX22
    -		      ? R_SPARC_GOT22
    -		      : R_SPARC_GOT10);
    -	  howto = _bfd_sparc_elf_howto_table + r_type;
    +	    {
    +	      r_type = (r_type == R_SPARC_GOTDATA_OP_HIX22
    +			? R_SPARC_GOTDATA_HIX22
    +			: R_SPARC_GOTDATA_LOX10);
    +	      howto = _bfd_sparc_elf_howto_table + r_type;
    +	    }
     	  break;
     
     	case R_SPARC_GOTDATA_OP:
    @@ -3193,6 +3191,8 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd,
     	  relocation = gdopoff (info, relocation);
     	  break;
     
    +	case R_SPARC_GOTDATA_OP_HIX22:
    +	case R_SPARC_GOTDATA_OP_LOX10:
     	case R_SPARC_GOT10:
     	case R_SPARC_GOT13:
     	case R_SPARC_GOT22:
    @@ -4017,7 +4017,8 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd,
     	  r = bfd_reloc_ok;
     	}
           else if (r_type == R_SPARC_HIX22
    -	       || r_type == R_SPARC_GOTDATA_HIX22)
    +	       || r_type == R_SPARC_GOTDATA_HIX22
    +	       || r_type == R_SPARC_GOTDATA_OP_HIX22)
     	{
     	  bfd_vma x;
     
    @@ -4036,7 +4037,8 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd,
     				  relocation);
     	}
           else if (r_type == R_SPARC_LOX10
    -	       || r_type == R_SPARC_GOTDATA_LOX10)
    +	       || r_type == R_SPARC_GOTDATA_LOX10
    +	       || r_type == R_SPARC_GOTDATA_OP_LOX10)
     	{
     	  bfd_vma x;


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