[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