summaryrefslogtreecommitdiff
path: root/gnu/usr.bin/ld/sparc
diff options
context:
space:
mode:
authorMarc Espie <espie@cvs.openbsd.org>1999-05-10 16:20:48 +0000
committerMarc Espie <espie@cvs.openbsd.org>1999-05-10 16:20:48 +0000
commit034edbd8249fc02865bf945465ebe50f02ea9e0d (patch)
treefb8464fb0410f6ce069c1d189a2b9fb394cbbfec /gnu/usr.bin/ld/sparc
parent4b5deb0f770235920cbdb04b47fdcbdf2d88df6c (diff)
cross-ld for sparc: iflush as nop, since it won't compile on non-sparc,
and is only needed for rtld anyway. and missing md_swap routines as well.
Diffstat (limited to 'gnu/usr.bin/ld/sparc')
-rw-r--r--gnu/usr.bin/ld/sparc/md.c85
-rw-r--r--gnu/usr.bin/ld/sparc/md.h5
2 files changed, 88 insertions, 2 deletions
diff --git a/gnu/usr.bin/ld/sparc/md.c b/gnu/usr.bin/ld/sparc/md.c
index e3c33a25100..38acf60d5d2 100644
--- a/gnu/usr.bin/ld/sparc/md.c
+++ b/gnu/usr.bin/ld/sparc/md.c
@@ -1,4 +1,4 @@
-/* * $OpenBSD: md.c,v 1.6 1998/03/26 19:47:33 niklas Exp $*/
+/* * $OpenBSD: md.c,v 1.7 1999/05/10 16:20:47 espie Exp $*/
/*
* Copyright (c) 1993 Paul Kranenburg
* All rights reserved.
@@ -92,9 +92,12 @@ static __inline void
iflush(sp)
jmpslot_t *sp;
{
+/* for a CROSS_LINKER, no rtld, so iflush is a nop, which is fortunate */
+#ifndef CROSS_LINKER
__asm __volatile("iflush %0+0" : : "r" (sp));
__asm __volatile("iflush %0+4" : : "r" (sp));
__asm __volatile("iflush %0+8" : : "r" (sp));
+#endif
}
/*
@@ -347,3 +350,83 @@ md_midcompat(hp)
#endif
}
#endif /* RTLD */
+
+#ifdef NEED_SWAP
+/*
+ * Byte swap routines for cross-linking.
+ */
+
+void
+md_swapin_exec_hdr(h)
+struct exec *h;
+{
+ int skip = 0;
+
+ if (!N_BADMAG(*h))
+ skip = 1;
+
+ swap_longs((long *)h + skip, sizeof(*h)/sizeof(long) - skip);
+}
+
+void
+md_swapout_exec_hdr(h)
+struct exec *h;
+{
+ /* NetBSD/OpenBSD: Always leave magic alone */
+ int skip = 1;
+#if 0
+ if (N_GETMAGIC(*h) == OMAGIC)
+ skip = 0;
+#endif
+
+ swap_longs((long *)h + skip, sizeof(*h)/sizeof(long) - skip);
+}
+
+void
+md_swapin_reloc(r, n)
+struct relocation_info *r;
+int n;
+{
+ int bits;
+
+ for (; n; n--, r++) {
+ r->r_address = md_swap_long(r->r_address);
+ bits = md_swap_long(((int *)r)[1]);
+ r->r_symbolnum = (bits>>8) & 0x00ffffff ;
+ r->r_extern = (bits>> 7) & 1;
+ r->r_type = bits & 31;
+ r->r_addend = md_swap_long(r->r_addend);
+ }
+}
+
+void
+md_swapout_reloc(r, n)
+struct relocation_info *r;
+int n;
+{
+ int bits;
+
+ for (; n; n--, r++) {
+ r->r_address = md_swap_long(r->r_address);
+ bits = (r->r_symbolnum & 0x00ffffff) << 8;
+ bits |= (r->r_extern & 1)<< 7;
+ bits |= (r->r_type & 31);
+ ((int *)r)[1] = md_swap_long(bits);
+ r->r_addend = md_swap_long(r->r_addend);
+ }
+}
+
+void
+md_swapout_jmpslot(j, n)
+jmpslot_t *j;
+int n;
+{
+ for (; n; n--, j++) {
+ j->opcode1 = md_swap_long(j->opcode1);
+ j->opcode2 = md_swap_long(j->opcode2);
+ j->reloc_index = md_swap_long(j->reloc_index);
+ }
+}
+
+#endif
+
diff --git a/gnu/usr.bin/ld/sparc/md.h b/gnu/usr.bin/ld/sparc/md.h
index 7147c5731fa..5753033876a 100644
--- a/gnu/usr.bin/ld/sparc/md.h
+++ b/gnu/usr.bin/ld/sparc/md.h
@@ -1,4 +1,4 @@
-/* * $OpenBSD: md.h,v 1.3 1998/03/26 19:47:35 niklas Exp $*/
+/* * $OpenBSD: md.h,v 1.4 1999/05/10 16:20:47 espie Exp $*/
/*
* Copyright (c) 1993 Paul Kranenburg
* All rights reserved.
@@ -34,6 +34,9 @@
* SPARC machine dependent definitions
*/
+#if defined(CROSS_LINKER) && defined(XHOST) && XHOST==i386
+#define NEED_SWAP
+#endif
#define MAX_ALIGNMENT (sizeof (double))