diff options
| author | kleink <kleink@NetBSD.org> | 1999-04-29 15:06:41 +0000 |
|---|---|---|
| committer | kleink <kleink@NetBSD.org> | 1999-04-29 15:06:41 +0000 |
| commit | 75030fa2ee85866b4e77ae1328b03f0055f13581 (patch) | |
| tree | 6c485eef2428f8ea35096cea021f294901bf65d2 /libexec | |
| parent | 3d538e05b630fb4eed9fd698bc32ce7735850a52 (diff) | |
Add m68k code.
Diffstat (limited to 'libexec')
| -rw-r--r-- | libexec/ld.elf_so/Makefile | 5 | ||||
| -rw-r--r-- | libexec/ld.elf_so/arch/m68k/Makefile.inc | 6 | ||||
| -rw-r--r-- | libexec/ld.elf_so/arch/m68k/rtld_start.S | 69 | ||||
| -rw-r--r-- | libexec/ld.elf_so/reloc.c | 19 |
4 files changed, 88 insertions, 11 deletions
diff --git a/libexec/ld.elf_so/Makefile b/libexec/ld.elf_so/Makefile index 450fe06eab2..0e83ccd4788 100644 --- a/libexec/ld.elf_so/Makefile +++ b/libexec/ld.elf_so/Makefile @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.26 1999/03/19 22:06:37 thorpej Exp $ +# $NetBSD: Makefile,v 1.27 1999/04/29 15:06:41 kleink Exp $ .include <bsd.own.mk> # for OBJECT_FMT definition @@ -12,7 +12,8 @@ M= ${.CURDIR}/arch/${ARCHSUBDIR} .if (${MACHINE} == "alpha") || \ (${MACHINE_ARCH} == "mipsel") || (${MACHINE_ARCH} == "mipseb") || \ (${MACHINE_ARCH} == "powerpc") || (${MACHINE} == "sparc64") || \ - (${MACHINE} == "i386") || (${MACHINE} == "sparc") + (${MACHINE} == "i386") || (${MACHINE_ARCH} == "m68k") || \ + (${MACHINE} == "sparc") # Adds SRCS, CPPFLAGS, LDFLAGS, etc. Must go first so MD startup source # is first. .if exists($M/Makefile.inc) diff --git a/libexec/ld.elf_so/arch/m68k/Makefile.inc b/libexec/ld.elf_so/arch/m68k/Makefile.inc new file mode 100644 index 00000000000..b6575d0a401 --- /dev/null +++ b/libexec/ld.elf_so/arch/m68k/Makefile.inc @@ -0,0 +1,6 @@ +# $NetBSD: Makefile.inc,v 1.1 1999/04/29 15:06:42 kleink Exp $ + +SRCS+= rtld_start.S + +CPPFLAGS+= -fpic -DELFSIZE=32 -DRTLD_RELOCATE_SELF +LDFLAGS+= -Bshareable -Bsymbolic -e .rtld_start diff --git a/libexec/ld.elf_so/arch/m68k/rtld_start.S b/libexec/ld.elf_so/arch/m68k/rtld_start.S new file mode 100644 index 00000000000..542fb4d323e --- /dev/null +++ b/libexec/ld.elf_so/arch/m68k/rtld_start.S @@ -0,0 +1,69 @@ +/* $NetBSD: rtld_start.S,v 1.1 1999/04/29 15:06:42 kleink Exp $ */ + +/*- + * Copyright (c) 1999 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Klaus Klein. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <machine/asm.h> + + .text + .align 2 + .globl .rtld_start + .type .rtld_start,@function +.rtld_start: + subql #8,%sp | storage for obj and cleanup + pea (%sp) | push sp + jbsr _rtld@PLTPC | entry = _rtld(sp) + addql #4,%sp | pop argument + moveal (%sp)+,%a1 | cleanup + moveal (%sp)+,%a0 | obj + moveal %d0,%a3 + jmp (%a3) | Go for it! + .size .rtld_start,.-.rtld_start + + .align 2 + .globl _rtld_bind_start + .type _rtld_bind_start,@function +_rtld_bind_start: + moveml %d0-%d1/%a0-%a1,-(%sp) | preserve caller-saved registers + movel 20(%sp),-(%sp) | push reloff + movel (16+4)(%sp),-(%sp) | push obj + jbsr _rtld_bind@PLTPC | %a0 = _rtld_bind(obj, reloff) + addql #8,%sp | pop args + movel %a0,(16+4)(%sp) | write fake `return' address over obj + moveml (%sp)+,%d0-%d1/%a0-%a1 | restore caller-saved registers + addql #4,%sp | skip reloff + rts | `return' right into function + .size _rtld_bind_start,.-_rtld_bind_start diff --git a/libexec/ld.elf_so/reloc.c b/libexec/ld.elf_so/reloc.c index af5259cd47c..c17ba77a184 100644 --- a/libexec/ld.elf_so/reloc.c +++ b/libexec/ld.elf_so/reloc.c @@ -1,4 +1,4 @@ -/* $NetBSD: reloc.c,v 1.19 1999/03/13 20:00:14 christos Exp $ */ +/* $NetBSD: reloc.c,v 1.20 1999/04/29 15:06:41 kleink Exp $ */ /* * Copyright 1996 John D. Polstra. @@ -157,11 +157,12 @@ _rtld_relocate_nonplt_object(obj, rela, dodebug) Elf_Addr *where = (Elf_Addr *)(obj->relocbase + rela->r_offset); const Elf_Sym *def; const Obj_Entry *defobj; -#if defined(__i386__) || defined(__alpha__) +#if defined(__alpha__) || defined(__i386__) || defined(__m68k__) extern Elf_Addr _GLOBAL_OFFSET_TABLE_[]; extern Elf_Dyn _DYNAMIC; #endif -#if defined(__i386__) || defined(__alpha__) || defined(__powerpc__) +#if defined(__alpha__) || defined(__i386__) || defined(__m68k__) || \ + defined(__powerpc__) Elf_Addr tmp; #endif @@ -170,7 +171,7 @@ _rtld_relocate_nonplt_object(obj, rela, dodebug) case R_TYPE(NONE): break; -#ifdef __i386__ +#if defined(__i386__) || defined(__m68k__) case R_TYPE(GOT32): def = _rtld_find_symdef(_rtld_objlist, rela->r_info, NULL, obj, @@ -216,7 +217,7 @@ _rtld_relocate_nonplt_object(obj, rela, dodebug) defobj->strtab + def->st_name, obj->path, (void *)*where, defobj->path)); break; -#endif /* __i386__ */ +#endif /* __i386__ || __m68k__ */ #ifdef __alpha__ case R_TYPE(REFQUAD): @@ -235,7 +236,7 @@ _rtld_relocate_nonplt_object(obj, rela, dodebug) break; #endif /* __alpha__ */ -#if defined(__i386__) || defined(__alpha__) +#if defined(__alpha__) || defined(__i386__) || defined(__m68k__) case R_TYPE(GLOB_DAT): def = _rtld_find_symdef(_rtld_objlist, rela->r_info, NULL, obj, &defobj, false); @@ -379,7 +380,7 @@ _rtld_relocate_plt_object(obj, rela, addrp, bind_now, dodebug) return _rtld_reloc_powerpc_plt(obj, rela, bind_now); #endif -#if defined(__alpha__) || defined(__i386__) +#if defined(__alpha__) || defined(__i386__) || defined(__m68k__) if (bind_now || obj->pltgot == NULL) { const Elf_Sym *def; const Obj_Entry *defobj; @@ -397,7 +398,7 @@ _rtld_relocate_plt_object(obj, rela, addrp, bind_now, dodebug) defobj->strtab + def->st_name, (void *)*where, (void *)new_value)); } else -#endif /* __alpha__ || __i386__ */ +#endif /* __alpha__ || __i386__ || __m68k__ */ if (!obj->mainprog) { /* Just relocate the GOT slots pointing into the PLT */ new_value = *where + (Elf_Addr)(obj->relocbase); @@ -566,7 +567,7 @@ _rtld_relocate_objects(first, bind_now, dodebug) /* Set the special PLTGOT entries. */ if (obj->pltgot != NULL) { -#if defined(__i386__) +#if defined(__i386__) || defined(__m68k__) obj->pltgot[1] = (Elf_Addr) obj; obj->pltgot[2] = (Elf_Addr) & _rtld_bind_start; #endif |
