[Patch mach-o/gas] reverse reloc lists
Tristan Gingold
gingold@adacore.com
Fri Jan 13 14:57:00 GMT 2012
On Jan 13, 2012, at 3:53 PM, Iain Sandoe wrote:
> the mach-o ld wants relocs to be listed in reverse order, and the native 'as' does this.
>
> Here is (Tristan's) code to do this.
>
> To this are added my modifications to the test-suite to deal with tests that are expecting relocs in normal order.
>
> We skip those tests in the normal places and duplicate reversed versions in gas/mach-o (which also serve as a good check of the reversal process). New tests attached, modified ones in-line.
>
> OK?
Yes.
Tristan.
> Iain
>
> <Tristan>
>
> gas:
>
> * config/obj-macho.c (obj_mach_o_reorder_section_relocs): New.
> * config/obj-macho.h (SET_SECTION_RELOCS): Define.
> (obj_mach_o_reorder_section_relocs): Declare.
>
> <Iain>
>
> gas/testsuite:
>
> * gas/all/redef2.d: Skip for Darwin.
> * gas/all/redef3.d: Likewise.
> * gas/all/weakref1.d: Likewise.
> * gas/macros/irp.d: Likewise.
> * gas/macros/repeat.d: Likewise.
> * gas/macros/rept.d: Likewise.
> * gas/macros/test2.d: Likewise.
> * gas/macros/vararg.d: Likewise.
> * gas/mach-o/macro-irp.d: New.
> * gas/mach-o/macro-repeat.d: New.
> * gas/mach-o/macro-rept.d: New.
> * gas/mach-o/macro-test2.d: New.
> * gas/mach-o/macro-vararg.d: New.
> * gas/mach-o/redef2.d: New.
> * gas/mach-o/redef3.d: New.
>
> =====
>
> gas/config/obj-macho.c | 17 +++++++++++++++++
> gas/config/obj-macho.h | 5 +++++
> 2 files changed, 22 insertions(+), 0 deletions(-)
>
> diff --git a/gas/config/obj-macho.c b/gas/config/obj-macho.c
> index ddf0988..f0cb43e 100644
> --- a/gas/config/obj-macho.c
> +++ b/gas/config/obj-macho.c
> @@ -1679,6 +1679,23 @@ obj_mach_o_frob_file_after_relocs (void)
> bfd_map_over_sections (stdoutput, obj_mach_o_set_indirect_symbols, (char *) 0);
> }
>
> +/* Reverse relocations order to make ld happy. */
> +
> +void
> +obj_mach_o_reorder_section_relocs (asection *sec, arelent **rels, unsigned int n)
> +{
> + unsigned int i;
> + unsigned int max = n / 2;
> +
> + for (i = 0; i < max; i++)
> + {
> + arelent *r = rels[i];
> + rels[i] = rels[n - i - 1];
> + rels[n - i - 1] = r;
> + }
> + bfd_set_reloc (stdoutput, sec, rels, n);
> +}
> +
> /* Support stabs for mach-o. */
>
> void
> diff --git a/gas/config/obj-macho.h b/gas/config/obj-macho.h
> index 2fc5cb6..bb8daf9 100644
> --- a/gas/config/obj-macho.h
> +++ b/gas/config/obj-macho.h
> @@ -68,6 +68,11 @@ void obj_mach_o_post_relax_hook (void);
> #define obj_frob_file_after_relocs obj_mach_o_frob_file_after_relocs
> extern void obj_mach_o_frob_file_after_relocs (void);
>
> +void obj_mach_o_reorder_section_relocs (asection *, arelent **, unsigned int);
> +
> +#define SET_SECTION_RELOCS(sec, relocs, n) \
> + obj_mach_o_reorder_section_relocs (sec, relocs, n)
> +
> #define EMIT_SECTION_SYMBOLS 0
>
> #define OBJ_PROCESS_STAB(SEG,W,S,T,O,D) obj_mach_o_process_stab(W,S,T,O,D)
>
> ====
>
> diff --git a/gas/testsuite/gas/all/redef2.d b/gas/testsuite/gas/all/redef2.d
> index 244d33d..c50cd6c 100644
> --- a/gas/testsuite/gas/all/redef2.d
> +++ b/gas/testsuite/gas/all/redef2.d
> @@ -1,5 +1,6 @@
> #objdump: -rs -j .data -j "\$DATA\$"
> #name: .equ redefinitions (2)
> +#not-target: *-*-darwin*
>
> .*: .*
>
> diff --git a/gas/testsuite/gas/all/redef3.d b/gas/testsuite/gas/all/redef3.d
> index 566f9c9..a16fac3 100644
> --- a/gas/testsuite/gas/all/redef3.d
> +++ b/gas/testsuite/gas/all/redef3.d
> @@ -1,6 +1,6 @@
> #objdump: -rsj .data
> #name: .equ redefinitions (3)
> -#not-target: arc-*-*
> +#not-target: arc-*-* *-*darwin*
>
> .*: .*
>
> diff --git a/gas/testsuite/gas/all/weakref1.d b/gas/testsuite/gas/all/weakref1.d
> index ee37d97..b44d1fc 100644
> --- a/gas/testsuite/gas/all/weakref1.d
> +++ b/gas/testsuite/gas/all/weakref1.d
> @@ -2,8 +2,9 @@
> #name: weakref tests, relocations
> # ecoff (OSF/alpha) lacks .weak support
> # pdp11 lacks .long
> +# darwin (mach-o) reverses the order of relocs.
> # the following must be present in all weakref1*.d
> -#not-target: alpha*-*-osf* *-*-ecoff pdp11-*-aout
> +#not-target: alpha*-*-osf* *-*-ecoff pdp11-*-aout *-*-darwin*
>
> #...
> RELOCATION RECORDS FOR \[(\.text|\$CODE\$)\]:
> diff --git a/gas/testsuite/gas/macros/irp.d b/gas/testsuite/gas/macros/irp.d
> index e6d7bcf..2c07f8e 100644
> --- a/gas/testsuite/gas/macros/irp.d
> +++ b/gas/testsuite/gas/macros/irp.d
> @@ -1,5 +1,7 @@
> #objdump: -r
> #name: macro irp
> +#darwin (mach-o) reverses relocs.
> +#not-target: *-*-darwin*
>
> .*: +file format .*
>
> diff --git a/gas/testsuite/gas/macros/repeat.d b/gas/testsuite/gas/macros/repeat.d
> index 272e441..1e6e422 100644
> --- a/gas/testsuite/gas/macros/repeat.d
> +++ b/gas/testsuite/gas/macros/repeat.d
> @@ -1,5 +1,7 @@
> #objdump: -r
> #name: nested irp/irpc/rept
> +# darwin (mach-o) reverse relocs.
> +#not-target: *-*-darwin*
>
> .*: +file format .*
>
> diff --git a/gas/testsuite/gas/macros/rept.d b/gas/testsuite/gas/macros/rept.d
> index 0022d5f..df2ed96 100644
> --- a/gas/testsuite/gas/macros/rept.d
> +++ b/gas/testsuite/gas/macros/rept.d
> @@ -1,5 +1,7 @@
> #objdump: -r
> #name: macro rept
> +#darwin (mach-o) reverses relocs.
> +#not-target: *-*-darwin*
>
> .*: +file format .*
>
> diff --git a/gas/testsuite/gas/macros/test2.d b/gas/testsuite/gas/macros/test2.d
> index 9a7d414..e5041cd 100644
> --- a/gas/testsuite/gas/macros/test2.d
> +++ b/gas/testsuite/gas/macros/test2.d
> @@ -1,5 +1,7 @@
> #objdump: -r
> #name: macro test 2
> +# darwin(mach-o) reverses the order of relocs.
> +#not-target: *-*-darwin*
>
> .*: +file format .*
>
> diff --git a/gas/testsuite/gas/macros/vararg.d b/gas/testsuite/gas/macros/vararg.d
> index 4b943fd..94c1511 100644
> --- a/gas/testsuite/gas/macros/vararg.d
> +++ b/gas/testsuite/gas/macros/vararg.d
> @@ -1,5 +1,7 @@
> #objdump: -r
> #name: macro vararg
> +# darwin (mach-o) reverses relocs.
> +#not-target: *-*-darwin*
>
> .*: +file format .*
>
> <12011314-rev-relocs-tests.txt>
>
>
>
More information about the Binutils
mailing list