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]

[Patch mach-o/gas] reverse reloc lists


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

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

Attachment: 12011314-rev-relocs-tests.txt
Description: Text document






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