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 mach-o] support LOCAL_SECTDIFF relocs for i386 mach-o.


On Feb 10, 2012, at 3:39 PM, Iain Sandoe wrote:

> this is the BFD-side of a patch of Tristan's to support relocs between Local symbols in different sections.
> ... rebased to trunk.
> 
> OK?

Yes, for the mach-o part.  I am not sure I can approve the change in reloc.c.

Tristan.

> Iain
> 
> bfd:
> 
> 	* reloc.c (BFD_RELOC_MACH_O_LOCAL_SECTDIFF):
> 	* libbfd.h: Regenerated.
> 	* bfd-in2.h: Likewise.
> 	* mach-o-i386.c (i386_howto_table): Include local sectdiff.
> 	(bfd_mach_o_i386_swap_reloc_in): Update for local sectdiff.
> 	(bfd_mach_o_i386_swap_reloc_out): Likewise.
> 
> bfd/bfd-in2.h |    3 +++
> bfd/libbfd.h  |    1 +
> bfd/mach-o-i386.c |   25 ++++++++++++++++++++++---
> bfd/reloc.c       |    4 ++++
> 4 files changed, 30 insertions(+), 3 deletions(-)
> 
> diff --git a/bfd/mach-o-i386.c b/bfd/mach-o-i386.c
> index 71272eb..e91e68a 100644
> --- a/bfd/mach-o-i386.c
> +++ b/bfd/mach-o-i386.c
> @@ -63,6 +63,7 @@ bfd_mach_o_i386_mkobject (bfd *abfd)
> 
> static reloc_howto_type i386_howto_table[]=
> {
> +  /* 0 */
>   HOWTO(BFD_RELOC_32, 0, 2, 32, FALSE, 0,
> 	complain_overflow_bitfield,
> 	NULL, "32",
> @@ -79,6 +80,7 @@ static reloc_howto_type i386_howto_table[]=
> 	complain_overflow_bitfield,
> 	NULL, "DISP32",
> 	FALSE, 0xffffffff, 0xffffffff, TRUE),
> +  /* 4 */
>   HOWTO(BFD_RELOC_16_PCREL, 0, 1, 16, TRUE, 0,
> 	complain_overflow_bitfield,
> 	NULL, "DISP16",
> @@ -87,6 +89,10 @@ static reloc_howto_type i386_howto_table[]=
> 	complain_overflow_bitfield,
> 	NULL, "SECTDIFF_32",
> 	FALSE, 0xffffffff, 0xffffffff, FALSE),
> +  HOWTO(BFD_RELOC_MACH_O_LOCAL_SECTDIFF, 0, 2, 32, FALSE, 0,
> +	complain_overflow_bitfield,
> +	NULL, "LSECTDIFF_32",
> +	FALSE, 0xffffffff, 0xffffffff, FALSE),
>   HOWTO(BFD_RELOC_MACH_O_PAIR, 0, 2, 32, FALSE, 0,
> 	complain_overflow_bitfield,
> 	NULL, "PAIR_32",
> @@ -103,15 +109,19 @@ bfd_mach_o_i386_swap_reloc_in (arelent *res, bfd_mach_o_reloc_info *reloc)
>         case BFD_MACH_O_GENERIC_RELOC_PAIR:
>           if (reloc->r_length != 2)
>             return FALSE;
> -          res->howto = &i386_howto_table[6];
> +          res->howto = &i386_howto_table[7];
>           res->address = res[-1].address;
>           return TRUE;
>         case BFD_MACH_O_GENERIC_RELOC_SECTDIFF:
> -        case BFD_MACH_O_GENERIC_RELOC_LOCAL_SECTDIFF:
>           if (reloc->r_length != 2)
>             return FALSE;
>           res->howto = &i386_howto_table[5];
>           return TRUE;
> +        case BFD_MACH_O_GENERIC_RELOC_LOCAL_SECTDIFF:
> +          if (reloc->r_length != 2)
> +            return FALSE;
> +          res->howto = &i386_howto_table[6];
> +          return TRUE;
>         default:
>           return FALSE;
>         }
> @@ -183,6 +193,15 @@ bfd_mach_o_i386_swap_reloc_out (arelent *rel, bfd_mach_o_reloc_info *rinfo)
>       rinfo->r_value = (*rel->sym_ptr_ptr)->value
>         + (*rel->sym_ptr_ptr)->section->vma;
>       break;
> +    case BFD_RELOC_MACH_O_LOCAL_SECTDIFF:
> +      rinfo->r_scattered = 1;
> +      rinfo->r_type = BFD_MACH_O_GENERIC_RELOC_LOCAL_SECTDIFF;
> +      rinfo->r_pcrel = 0;
> +      rinfo->r_length = 2;
> +      rinfo->r_extern = 0;
> +      rinfo->r_value = (*rel->sym_ptr_ptr)->value
> +        + (*rel->sym_ptr_ptr)->section->vma;
> +      break;
>     case BFD_RELOC_MACH_O_PAIR:
>       rinfo->r_address = 0;
>       rinfo->r_scattered = 1;
> diff --git a/bfd/reloc.c b/bfd/reloc.c
> index 5cde4a8..778276f 100644
> --- a/bfd/reloc.c
> +++ b/bfd/reloc.c
> @@ -5594,6 +5594,10 @@ ENUMDOC
>   Difference between two section addreses.  Must be followed by a
>   BFD_RELOC_MACH_O_PAIR.
> ENUM
> +  BFD_RELOC_MACH_O_LOCAL_SECTDIFF
> +ENUMDOC
> +  Like BFD_RELOC_MACH_O_SECTDIFF but with a local symbol.
> +ENUM
>   BFD_RELOC_MACH_O_PAIR
> ENUMDOC
>   Pair of relocation.  Contains the first symbol.
> 


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