ping: Re: [Patch mach-o] support LOCAL_SECTDIFF relocs for i386 mach-o.
Iain Sandoe
developer@sandoe-acoustics.co.uk
Thu Feb 16 08:56:00 GMT 2012
I guess folks assumed this had been handled by Tristan.
On 10 Feb 2012, at 14:43, Tristan Gingold wrote:
> 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.
please would someone comment on/review the relocs part,
thanks
Iain
>
> Tristan.
>
>> Iain
>>
>> bfd:
>>
>> * reloc.c (BFD_RELOC_MACH_O_LOCAL_SECTDIFF): New.
>> * 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.
>>
>
More information about the Binutils
mailing list