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? Iain 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. 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 .*