Add machine dependent code for NetBSD/powerpc

This commit is contained in:
ws 1996-11-03 18:02:42 +00:00
parent 648f041eb1
commit 79b6fe9805
16 changed files with 6081 additions and 0 deletions

View File

@ -0,0 +1,4 @@
# $NetBSD: Makefile.powerpc,v 1.1 1996/11/03 18:02:42 ws Exp $
CFLAGS+= -DNON_BROKEN_WORDS -DPIC
SRCS+= tc-powerpc.c atof-ieee.c

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,54 @@
/* tc-ppc.h -- Header file for tc-ppc.c.
Copyright (C) 1994 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Cygnus Support.
This file is part of GAS, the GNU Assembler.
GAS is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GAS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GAS; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#ifndef TC_POWERPC
#define TC_POWERPC
#ifdef __NetBSD__
#include <machine/reloc.h>
#define AOUT_MACHTYPE 149
#endif
/* For now, support only big-endian */
#define TARGET_BYTES_BIG_ENDIAN 1
#define PPC_BIG_ENDIAN 1
/* Default CPU: */
#define TARGET_CPU "powerpc"
/* Permit temporary numeric labels. */
#define LOCAL_LABELS_FB 1
/* $ is used to refer to the current location. */
#define DOLLAR_DOT
/* We don't need to handle .word strangely. */
#define WORKING_DOT_WORD
/* The name of the global offset table generated by the compiler. */
#define GLOBAL_OFFSET_TABLE_NAME "_GLOBAL_OFFSET_TABLE_"
#define tc_headers_hook(a)
#define tc_crawl_symbol_chain(a)
#define tc_aout_pre_write_hook(a)
#define LISTING_HEADER "PowerPC GAS "
#endif /* TC_POWERPC */

3073
gnu/usr.bin/gas/opcode/ppc.h Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,17 @@
/*
* $NetBSD: md-static-funcs.c,v 1.1 1996/11/03 18:06:50 ws Exp $
*
* Called by ld.so when onanating.
* This *must* be a static function, so it is not called through a jmpslot.
*/
static void
md_relocate_simple(r, relocation, addr)
struct relocation_info *r;
long relocation;
char *addr;
{
if (r->r_relative)
*(long *)addr += relocation;
}

View File

@ -0,0 +1,287 @@
/* $NetBSD: md.c,v 1.1 1996/11/03 18:06:50 ws Exp $ */
/*
* Copyright (c) 1993 Paul Kranenburg
* All rights reserved.
*
* 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 Paul Kranenburg.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 <sys/param.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <err.h>
#include <fcntl.h>
#include <a.out.h>
#include <stab.h>
#include <string.h>
#include "ld.h"
static int reloc_target_rightshift[] = {
-1, 0, 2, 0, 0, 16, 16, 2,
-1, -1, 2, 2, -1, -1, 0, 0,
16, 16, 2, -1, -1, -1, -1, -1,
-1, -1, 0, 0, 0, 0, 16, 16
};
static int reloc_target_bitpos[] = {
-1, 0, 2, 0, 0, 0, 0, 2,
-1, -1, 2, 2, -1, -1, 0, 0,
0, 0, 2, -1, -1, -1, -1, -1,
-1, -1, 0, 0, 0, 0, 0, 0
};
static int reloc_target_size[] = {
-1, 4, 4, 2, 2, 2, 2, 4,
-1, -1, 4, 4, -1, -1, 2, 2,
2, 2, 4, -1, -1, -1, -1, -1,
-1, -1, 4, 4, 4, 2, 2, 2
};
static int reloc_target_bitsize[] = {
-1, 32, 24, 16, 16, 16, 16, 14,
-1, -1, 24, 14, -1, -1, 16, 16,
16, 16, 24, -1, -1, -1, -1, -1,
-1, -1, 32, 32, 32, 16, 16, 16
};
/*
* Get relocation addend corresponding to relocation record RP
* from address ADDR
*/
long
md_get_addend(rp, addr)
struct relocation_info *rp;
unsigned char *addr;
{
return rp->r_addend;
}
/*
* Put RELOCATION at ADDR according to relocation record RP.
*/
void
md_relocate(rp, relocation, addr, relocatable_output)
struct relocation_info *rp;
long relocation;
unsigned char *addr;
int relocatable_output;
{
register unsigned long mask;
int ha_adj = 0;
if (relocatable_output) {
/*
* Store relocation where the next link-edit run
* will look for it.
*/
rp->r_addend = relocation;
return;
}
if (rp->r_type == RELOC_16_HA
|| rp->r_type == RELOC_GOT16_HA
|| rp->r_type == RELOC_PLT16_HA)
relocation += (relocation & 0x8000) << 1;
relocation >>= RELOC_VALUE_RIGHTSHIFT(rp);
/* Unshifted mask for relocation */
mask = 1 << RELOC_TARGET_BITSIZE(rp) - 1;
mask |= mask - 1;
relocation &= mask;
/* Shift everything up to where it's going to be used */
relocation <<= RELOC_TARGET_BITPOS(rp);
mask <<= RELOC_TARGET_BITPOS(rp);
switch (RELOC_TARGET_SIZE(rp)) {
case 4:
*(u_long *)addr &= ~mask;
*(u_long *)addr |= relocation;
break;
case 2:
*(u_short *)addr &= ~mask;
*(u_short *)addr |= relocation;
break;
default:
errx(1, "Unknown relocation type %d", rp->r_type);
}
}
#ifndef RTLD
/*
* Machine dependent part of claim_rrs_reloc().
* Set RRS relocation type.
*/
int
md_make_reloc(rp, r, type)
struct relocation_info *rp, *r;
int type;
{
r->r_type = rp->r_type;
r->r_addend = rp->r_addend;
if (RELOC_PCREL_P(rp))
r->r_addend -= pc_relocation;
return 1;
}
#endif
/*
* Set up a transfer from jmpslot at OFFSET (relative to the PLT table)
* to the binder slot (which is at offset 0 of the PLT).
*/
void
md_make_jmpslot(sp, offset, index)
jmpslot_t *sp;
long offset;
long index;
{
errx(1, "md_make_jmpslot unimplemented");
}
/*
* Set up a "direct" transfer (ie. not through the run-time binder) from
* jmpslot at OFFSET to ADDR. Used by `ld' when the SYMBOLIC flag is on,
* and by `ld.so' after resolving the symbol.
*/
void
md_fix_jmpslot(sp, offset, addr)
jmpslot_t *sp;
long offset;
u_long addr;
{
errx(1, "md_fix_jmpslot unimplemented");
}
/*
* Update the relocation record for a RRS jmpslot.
*/
void
md_make_jmpreloc(rp, r, type)
struct relocation_info *rp, *r;
int type;
{
errx(1, "md_make_jmpreloc unimplemented");
}
/*
* Set relocation type for a RRS GOT relocation.
*/
void
md_make_gotreloc(rp, r, type)
struct relocation_info *rp, *r;
int type;
{
errx(1, "md_make_gotreloc unimplemented");
}
/*
* Set relocation type for a RRS copy operation.
*/
void
md_make_cpyreloc(rp, r)
struct relocation_info *rp, *r;
{
errx(1, "md_make_cpyreloc unimplemented");
}
void
md_set_breakpoint(where, savep)
long where;
long *savep;
{
*savep = *(long *)where;
*(char *)where = TRAP;
}
#ifndef RTLD
/*
* Initialize (output) exec header such that useful values are
* obtained from subsequent N_*() macro evaluations.
*/
void
md_init_header(hp, magic, flags)
struct exec *hp;
int magic, flags;
{
N_SETMAGIC((*hp), magic, MID_MACHINE, flags);
/* TEXT_START depends on the value of outheader.a_entry. */
if (!(link_mode & SHAREABLE))
hp->a_entry = PAGSIZ;
}
#endif /* RTLD */
#ifdef NEED_SWAP
/*
* Byte swap routines for cross-linking.
*/
void
md_swapin_exec_hdr(h)
struct exec *h;
{
swap_longs((long *)h + 1, sizeof(*h)/sizeof(long) - skip);
}
void
md_swapout_exec_hdr(h)
struct exec *h;
{
swap_longs((long *)h + 1, sizeof(*h)/sizeof(long) - skip);
}
void
md_swapin_reloc(r, n)
struct relocation_info *r;
int n;
{
errx(1, "md_swapin_reloc unimplemented");
}
void
md_swapout_reloc(r, n)
struct relocation_info *r;
int n;
{
errx(1, "md_swapout_reloc unimplemented");
}
void
md_swapout_jmpslot(j, n)
jmpslot_t *j;
int n;
{
errx(1, "md_swapout_jmpslot unimplemented");
}
#endif /* NEED_SWAP */

View File

@ -0,0 +1,223 @@
/* $NetBSD: md.h,v 1.1 1996/11/03 18:06:51 ws Exp $ */
/*
* Copyright (c) 1995 Wolfgang Solfrank
* Copyright (c) 1995 TooLs GmbH
* All rights reserved.
*
* 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 TooLs GmbH.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 TOOLS GMBH 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.
*/
#define MAX_ALIGNMENT (sizeof (double)) /* 32??? */
#define PAGSIZ __LDPGSZ
#define N_SET_FLAG(ex,f) N_SETMAGIC(ex, \
N_GETMAGIC(ex), \
MID_MACHINE, \
N_GETFLAG(ex)|(f))
#define N_IS_DYNAMIC(ex) ((N_GETFLAG(ex) & EX_DYNAMIC))
#define N_BADMID(ex) (N_GETMID(ex) != MID_MACHINE)
/*
* Should be handled by a.out.h ?
*/
#define N_ADJUST(ex) (((ex).a_entry < PAGSIZ) ? -PAGSIZ : 0)
#define TEXT_START(ex) (N_TXTADDR(ex) + N_ADJUST(ex))
#define DATA_START(ex) (N_DATADDR(ex) + N_ADJUST(ex))
#define RELOC_ADDRESS(r) ((r)->r_address)
#define RELOC_EXTERN_P(r) ((r)->r_extern)
#define RELOC_TYPE(r) ((r)->r_symbolnum)
#define RELOC_SYMBOL(r) ((r)->r_symbolnum)
#define RELOC_MEMORY_SUB_P(r) 0
#define RELOC_MEMORY_ADD_P(r) 0
#define RELOC_ADD_EXTRA(r) ((r)->r_addend)
#define RELOC_PCREL_P(r) \
(((r)->r_type >= RELOC_REL24 && (r)->r_type <= RELOC_REL14_NTAKEN) \
|| (r)->r_type == RELOC_PLT24 \
|| (r)->r_type == RELOC_REL32 \
|| (r)->r_type == RELOC_PLTREL32)
#define RELOC_VALUE_RIGHTSHIFT(r) (reloc_target_rightshift[(r)->r_type])
#define RELOC_TARGET_SIZE(r) (reloc_target_size[(r)->r_type])
#define RELOC_TARGET_BITPOS(r) (reloc_target_bitpos[(r)->r_type])
#define RELOC_TARGET_BITSIZE(r) (reloc_target_bitsize[(r)->r_type])
#define RELOC_JMPTAB_P(r) \
((r)->r_type == RELOC_PLT24 \
|| ((r)->r_type >= RELOC_PLT32 \
&& (r)->r_type <= RELOC_PLT16_HA))
#define RELOC_BASEREL_P(r) 0
#define RELOC_RELATIVE_P(r) ((r)->r_type == RELOC_RELATIVE)
#define RELOC_COPY_P(r) ((r)->r_type == RELOC_COPY)
#define RELOC_LAZY_P(r) ((r)->r_type == RELOC_JMP_SLOT)
#define RELOC_STATICS_THROUGH_GOT_P(r) 1
#define JMPSLOT_NEEDS_RELOC 1
#define CHECK_GOT_RELOC(r) \
((r)->r_type >= RELOC_16_LO \
&& (r)->r_type <= RELOC_16_HA)
#define md_got_reloc(r) (-(r)->r_address)
#define RELOC_INIT_SEGMENT_RELOC(r) ((r)->r_type = RELOC_32)
/* Width of a Global Offset Table entry */
typedef long got_t;
/*
* TO BE DONE!!!
*/
typedef struct jmpslot {
u_long opcode;
u_long addr;
u_long reloc_index;
#define JMPSLOT_RELOC_MASK 0xffffffff
} jmpslot_t;
#define NOP 0
#define CALL 0
#define JUMP 0
#define TRAP 0
/*
* Byte swap defs for cross linking
*/
#if !defined(NEED_SWAP)
#define md_swapin_exec_hdr(h)
#define md_swapout_exec_hdr(h)
#define md_swapin_symbols(s,n)
#define md_swapout_symbols(s,n)
#define md_swapin_zsymbols(s,n)
#define md_swapout_zsymbols(s,n)
#define md_swapin_reloc(r,n)
#define md_swapout_reloc(r,n)
#define md_swapin__dynamic(l)
#define md_swapout__dynamic(l)
#define md_swapin_section_dispatch_table(l)
#define md_swapout_section_dispatch_table(l)
#define md_swapin_so_debug(d)
#define md_swapout_so_debug(d)
#define md_swapin_rrs_hash(f,n)
#define md_swapout_rrs_hash(f,n)
#define md_swapin_sod(l,n)
#define md_swapout_sod(l,n)
#define md_swapout_jmpslot(j,n)
#define md_swapout_got(g,n)
#define md_swapin_ranlib_hdr(h,n)
#define md_swapout_ranlib_hdr(h,n)
#endif /* NEED_SWAP */
#ifdef CROSS_LINKER
#define get_byte(p) ( ((unsigned char *)(p))[0] )
#define get_short(p) ( ( ((unsigned char *)(p))[0] << 8) | \
( ((unsigned char *)(p))[1] ) \
)
#define get_long(p) ( ( ((unsigned char *)(p))[0] << 24) | \
( ((unsigned char *)(p))[1] << 16) | \
( ((unsigned char *)(p))[2] << 8 ) | \
( ((unsigned char *)(p))[3] ) \
)
#define put_byte(p, v) { ((unsigned char *)(p))[0] = ((unsigned long)(v)); }
#define put_short(p, v) { ((unsigned char *)(p))[0] = \
((((unsigned long)(v)) >> 8) & 0xff); \
((unsigned char *)(p))[1] = \
((((unsigned long)(v)) ) & 0xff); }
#define put_long(p, v) { ((unsigned char *)(p))[0] = \
((((unsigned long)(v)) >> 24) & 0xff); \
((unsigned char *)(p))[1] = \
((((unsigned long)(v)) >> 16) & 0xff); \
((unsigned char *)(p))[2] = \
((((unsigned long)(v)) >> 8) & 0xff); \
((unsigned char *)(p))[3] = \
((((unsigned long)(v)) ) & 0xff); }
#ifdef NEED_SWAP
/* Define IO byte swapping routines */
void md_swapin_exec_hdr __P((struct exec *));
void md_swapout_exec_hdr __P((struct exec *));
void md_swapin_reloc __P((struct relocation_info *, int));
void md_swapout_reloc __P((struct relocation_info *, int));
void md_swapout_jmpslot __P((jmpslot_t *, int));
#define md_swapin_symbols(s,n) swap_symbols(s,n)
#define md_swapout_symbols(s,n) swap_symbols(s,n)
#define md_swapin_zsymbols(s,n) swap_zsymbols(s,n)
#define md_swapout_zsymbols(s,n) swap_zsymbols(s,n)
#define md_swapin__dynamic(l) swap__dynamic(l)
#define md_swapout__dynamic(l) swap__dynamic(l)
#define md_swapin_section_dispatch_table(l) swap_section_dispatch_table(l)
#define md_swapout_section_dispatch_table(l) swap_section_dispatch_table(l)
#define md_swapin_so_debug(d) swap_so_debug(d)
#define md_swapout_so_debug(d) swap_so_debug(d)
#define md_swapin_rrs_hash(f,n) swap_rrs_hash(f,n)
#define md_swapout_rrs_hash(f,n) swap_rrs_hash(f,n)
#define md_swapin_sod(l,n) swapin_sod(l,n)
#define md_swapout_sod(l,n) swapout_sod(l,n)
#define md_swapout_got(g,n) swap_longs((long*)(g),n)
#define md_swapin_ranlib_hdr(h,n) swap_ranlib_hdr(h,n)
#define md_swapout_ranlib_hdr(h,n) swap_ranlib_hdr(h,n)
#define md_swap_short(x) ( (((x) >> 8) & 0xff) | (((x) & 0xff) << 8) )
#define md_swap_long(x) ( (((x) >> 24) & 0xff ) | (((x) >> 8 ) & 0xff00 ) | \
(((x) << 8 ) & 0xff0000) | (((x) << 24) & 0xff000000))
#else /* We need not swap, but must pay attention to alignment: */
#define md_swap_short(x) (x)
#define md_swap_long(x) (x)
#endif /* NEED_SWAP */
#else /* Not a cross linker: use native */
#define md_swap_short(x) (x)
#define md_swap_long(x) (x)
#define get_byte(where) (*(char *)(where))
#define get_short(where) (*(short *)(where))
#define get_long(where) (*(long *)(where))
#define put_byte(where,what) (*(char *)(where) = (what))
#define put_short(where,what) (*(short *)(where) = (what))
#define put_long(where,what) (*(long *)(where) = (what))
#endif /* CROSS_LINKER */

View File

@ -0,0 +1,19 @@
/*
* PowerPC run-time link editor entry points.
*/
.text
.globl _binder, _binder_entry
/*
* _rtl(int version, struct crt_ldso *crtp)
*/
_rtl: /* crt0 calls us here */
ret
/*
* First call to a procedure generally comes through here for
* binding.
*/
_binder_entry:
ret

View File

@ -0,0 +1,17 @@
/*
* $NetBSD: md-static-funcs.c,v 1.1 1996/11/03 18:06:50 ws Exp $
*
* Called by ld.so when onanating.
* This *must* be a static function, so it is not called through a jmpslot.
*/
static void
md_relocate_simple(r, relocation, addr)
struct relocation_info *r;
long relocation;
char *addr;
{
if (r->r_relative)
*(long *)addr += relocation;
}

287
gnu/usr.bin/ld/powerpc/md.c Normal file
View File

@ -0,0 +1,287 @@
/* $NetBSD: md.c,v 1.1 1996/11/03 18:06:50 ws Exp $ */
/*
* Copyright (c) 1993 Paul Kranenburg
* All rights reserved.
*
* 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 Paul Kranenburg.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 <sys/param.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <err.h>
#include <fcntl.h>
#include <a.out.h>
#include <stab.h>
#include <string.h>
#include "ld.h"
static int reloc_target_rightshift[] = {
-1, 0, 2, 0, 0, 16, 16, 2,
-1, -1, 2, 2, -1, -1, 0, 0,
16, 16, 2, -1, -1, -1, -1, -1,
-1, -1, 0, 0, 0, 0, 16, 16
};
static int reloc_target_bitpos[] = {
-1, 0, 2, 0, 0, 0, 0, 2,
-1, -1, 2, 2, -1, -1, 0, 0,
0, 0, 2, -1, -1, -1, -1, -1,
-1, -1, 0, 0, 0, 0, 0, 0
};
static int reloc_target_size[] = {
-1, 4, 4, 2, 2, 2, 2, 4,
-1, -1, 4, 4, -1, -1, 2, 2,
2, 2, 4, -1, -1, -1, -1, -1,
-1, -1, 4, 4, 4, 2, 2, 2
};
static int reloc_target_bitsize[] = {
-1, 32, 24, 16, 16, 16, 16, 14,
-1, -1, 24, 14, -1, -1, 16, 16,
16, 16, 24, -1, -1, -1, -1, -1,
-1, -1, 32, 32, 32, 16, 16, 16
};
/*
* Get relocation addend corresponding to relocation record RP
* from address ADDR
*/
long
md_get_addend(rp, addr)
struct relocation_info *rp;
unsigned char *addr;
{
return rp->r_addend;
}
/*
* Put RELOCATION at ADDR according to relocation record RP.
*/
void
md_relocate(rp, relocation, addr, relocatable_output)
struct relocation_info *rp;
long relocation;
unsigned char *addr;
int relocatable_output;
{
register unsigned long mask;
int ha_adj = 0;
if (relocatable_output) {
/*
* Store relocation where the next link-edit run
* will look for it.
*/
rp->r_addend = relocation;
return;
}
if (rp->r_type == RELOC_16_HA
|| rp->r_type == RELOC_GOT16_HA
|| rp->r_type == RELOC_PLT16_HA)
relocation += (relocation & 0x8000) << 1;
relocation >>= RELOC_VALUE_RIGHTSHIFT(rp);
/* Unshifted mask for relocation */
mask = 1 << RELOC_TARGET_BITSIZE(rp) - 1;
mask |= mask - 1;
relocation &= mask;
/* Shift everything up to where it's going to be used */
relocation <<= RELOC_TARGET_BITPOS(rp);
mask <<= RELOC_TARGET_BITPOS(rp);
switch (RELOC_TARGET_SIZE(rp)) {
case 4:
*(u_long *)addr &= ~mask;
*(u_long *)addr |= relocation;
break;
case 2:
*(u_short *)addr &= ~mask;
*(u_short *)addr |= relocation;
break;
default:
errx(1, "Unknown relocation type %d", rp->r_type);
}
}
#ifndef RTLD
/*
* Machine dependent part of claim_rrs_reloc().
* Set RRS relocation type.
*/
int
md_make_reloc(rp, r, type)
struct relocation_info *rp, *r;
int type;
{
r->r_type = rp->r_type;
r->r_addend = rp->r_addend;
if (RELOC_PCREL_P(rp))
r->r_addend -= pc_relocation;
return 1;
}
#endif
/*
* Set up a transfer from jmpslot at OFFSET (relative to the PLT table)
* to the binder slot (which is at offset 0 of the PLT).
*/
void
md_make_jmpslot(sp, offset, index)
jmpslot_t *sp;
long offset;
long index;
{
errx(1, "md_make_jmpslot unimplemented");
}
/*
* Set up a "direct" transfer (ie. not through the run-time binder) from
* jmpslot at OFFSET to ADDR. Used by `ld' when the SYMBOLIC flag is on,
* and by `ld.so' after resolving the symbol.
*/
void
md_fix_jmpslot(sp, offset, addr)
jmpslot_t *sp;
long offset;
u_long addr;
{
errx(1, "md_fix_jmpslot unimplemented");
}
/*
* Update the relocation record for a RRS jmpslot.
*/
void
md_make_jmpreloc(rp, r, type)
struct relocation_info *rp, *r;
int type;
{
errx(1, "md_make_jmpreloc unimplemented");
}
/*
* Set relocation type for a RRS GOT relocation.
*/
void
md_make_gotreloc(rp, r, type)
struct relocation_info *rp, *r;
int type;
{
errx(1, "md_make_gotreloc unimplemented");
}
/*
* Set relocation type for a RRS copy operation.
*/
void
md_make_cpyreloc(rp, r)
struct relocation_info *rp, *r;
{
errx(1, "md_make_cpyreloc unimplemented");
}
void
md_set_breakpoint(where, savep)
long where;
long *savep;
{
*savep = *(long *)where;
*(char *)where = TRAP;
}
#ifndef RTLD
/*
* Initialize (output) exec header such that useful values are
* obtained from subsequent N_*() macro evaluations.
*/
void
md_init_header(hp, magic, flags)
struct exec *hp;
int magic, flags;
{
N_SETMAGIC((*hp), magic, MID_MACHINE, flags);
/* TEXT_START depends on the value of outheader.a_entry. */
if (!(link_mode & SHAREABLE))
hp->a_entry = PAGSIZ;
}
#endif /* RTLD */
#ifdef NEED_SWAP
/*
* Byte swap routines for cross-linking.
*/
void
md_swapin_exec_hdr(h)
struct exec *h;
{
swap_longs((long *)h + 1, sizeof(*h)/sizeof(long) - skip);
}
void
md_swapout_exec_hdr(h)
struct exec *h;
{
swap_longs((long *)h + 1, sizeof(*h)/sizeof(long) - skip);
}
void
md_swapin_reloc(r, n)
struct relocation_info *r;
int n;
{
errx(1, "md_swapin_reloc unimplemented");
}
void
md_swapout_reloc(r, n)
struct relocation_info *r;
int n;
{
errx(1, "md_swapout_reloc unimplemented");
}
void
md_swapout_jmpslot(j, n)
jmpslot_t *j;
int n;
{
errx(1, "md_swapout_jmpslot unimplemented");
}
#endif /* NEED_SWAP */

223
gnu/usr.bin/ld/powerpc/md.h Normal file
View File

@ -0,0 +1,223 @@
/* $NetBSD: md.h,v 1.1 1996/11/03 18:06:51 ws Exp $ */
/*
* Copyright (c) 1995 Wolfgang Solfrank
* Copyright (c) 1995 TooLs GmbH
* All rights reserved.
*
* 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 TooLs GmbH.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 TOOLS GMBH 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.
*/
#define MAX_ALIGNMENT (sizeof (double)) /* 32??? */
#define PAGSIZ __LDPGSZ
#define N_SET_FLAG(ex,f) N_SETMAGIC(ex, \
N_GETMAGIC(ex), \
MID_MACHINE, \
N_GETFLAG(ex)|(f))
#define N_IS_DYNAMIC(ex) ((N_GETFLAG(ex) & EX_DYNAMIC))
#define N_BADMID(ex) (N_GETMID(ex) != MID_MACHINE)
/*
* Should be handled by a.out.h ?
*/
#define N_ADJUST(ex) (((ex).a_entry < PAGSIZ) ? -PAGSIZ : 0)
#define TEXT_START(ex) (N_TXTADDR(ex) + N_ADJUST(ex))
#define DATA_START(ex) (N_DATADDR(ex) + N_ADJUST(ex))
#define RELOC_ADDRESS(r) ((r)->r_address)
#define RELOC_EXTERN_P(r) ((r)->r_extern)
#define RELOC_TYPE(r) ((r)->r_symbolnum)
#define RELOC_SYMBOL(r) ((r)->r_symbolnum)
#define RELOC_MEMORY_SUB_P(r) 0
#define RELOC_MEMORY_ADD_P(r) 0
#define RELOC_ADD_EXTRA(r) ((r)->r_addend)
#define RELOC_PCREL_P(r) \
(((r)->r_type >= RELOC_REL24 && (r)->r_type <= RELOC_REL14_NTAKEN) \
|| (r)->r_type == RELOC_PLT24 \
|| (r)->r_type == RELOC_REL32 \
|| (r)->r_type == RELOC_PLTREL32)
#define RELOC_VALUE_RIGHTSHIFT(r) (reloc_target_rightshift[(r)->r_type])
#define RELOC_TARGET_SIZE(r) (reloc_target_size[(r)->r_type])
#define RELOC_TARGET_BITPOS(r) (reloc_target_bitpos[(r)->r_type])
#define RELOC_TARGET_BITSIZE(r) (reloc_target_bitsize[(r)->r_type])
#define RELOC_JMPTAB_P(r) \
((r)->r_type == RELOC_PLT24 \
|| ((r)->r_type >= RELOC_PLT32 \
&& (r)->r_type <= RELOC_PLT16_HA))
#define RELOC_BASEREL_P(r) 0
#define RELOC_RELATIVE_P(r) ((r)->r_type == RELOC_RELATIVE)
#define RELOC_COPY_P(r) ((r)->r_type == RELOC_COPY)
#define RELOC_LAZY_P(r) ((r)->r_type == RELOC_JMP_SLOT)
#define RELOC_STATICS_THROUGH_GOT_P(r) 1
#define JMPSLOT_NEEDS_RELOC 1
#define CHECK_GOT_RELOC(r) \
((r)->r_type >= RELOC_16_LO \
&& (r)->r_type <= RELOC_16_HA)
#define md_got_reloc(r) (-(r)->r_address)
#define RELOC_INIT_SEGMENT_RELOC(r) ((r)->r_type = RELOC_32)
/* Width of a Global Offset Table entry */
typedef long got_t;
/*
* TO BE DONE!!!
*/
typedef struct jmpslot {
u_long opcode;
u_long addr;
u_long reloc_index;
#define JMPSLOT_RELOC_MASK 0xffffffff
} jmpslot_t;
#define NOP 0
#define CALL 0
#define JUMP 0
#define TRAP 0
/*
* Byte swap defs for cross linking
*/
#if !defined(NEED_SWAP)
#define md_swapin_exec_hdr(h)
#define md_swapout_exec_hdr(h)
#define md_swapin_symbols(s,n)
#define md_swapout_symbols(s,n)
#define md_swapin_zsymbols(s,n)
#define md_swapout_zsymbols(s,n)
#define md_swapin_reloc(r,n)
#define md_swapout_reloc(r,n)
#define md_swapin__dynamic(l)
#define md_swapout__dynamic(l)
#define md_swapin_section_dispatch_table(l)
#define md_swapout_section_dispatch_table(l)
#define md_swapin_so_debug(d)
#define md_swapout_so_debug(d)
#define md_swapin_rrs_hash(f,n)
#define md_swapout_rrs_hash(f,n)
#define md_swapin_sod(l,n)
#define md_swapout_sod(l,n)
#define md_swapout_jmpslot(j,n)
#define md_swapout_got(g,n)
#define md_swapin_ranlib_hdr(h,n)
#define md_swapout_ranlib_hdr(h,n)
#endif /* NEED_SWAP */
#ifdef CROSS_LINKER
#define get_byte(p) ( ((unsigned char *)(p))[0] )
#define get_short(p) ( ( ((unsigned char *)(p))[0] << 8) | \
( ((unsigned char *)(p))[1] ) \
)
#define get_long(p) ( ( ((unsigned char *)(p))[0] << 24) | \
( ((unsigned char *)(p))[1] << 16) | \
( ((unsigned char *)(p))[2] << 8 ) | \
( ((unsigned char *)(p))[3] ) \
)
#define put_byte(p, v) { ((unsigned char *)(p))[0] = ((unsigned long)(v)); }
#define put_short(p, v) { ((unsigned char *)(p))[0] = \
((((unsigned long)(v)) >> 8) & 0xff); \
((unsigned char *)(p))[1] = \
((((unsigned long)(v)) ) & 0xff); }
#define put_long(p, v) { ((unsigned char *)(p))[0] = \
((((unsigned long)(v)) >> 24) & 0xff); \
((unsigned char *)(p))[1] = \
((((unsigned long)(v)) >> 16) & 0xff); \
((unsigned char *)(p))[2] = \
((((unsigned long)(v)) >> 8) & 0xff); \
((unsigned char *)(p))[3] = \
((((unsigned long)(v)) ) & 0xff); }
#ifdef NEED_SWAP
/* Define IO byte swapping routines */
void md_swapin_exec_hdr __P((struct exec *));
void md_swapout_exec_hdr __P((struct exec *));
void md_swapin_reloc __P((struct relocation_info *, int));
void md_swapout_reloc __P((struct relocation_info *, int));
void md_swapout_jmpslot __P((jmpslot_t *, int));
#define md_swapin_symbols(s,n) swap_symbols(s,n)
#define md_swapout_symbols(s,n) swap_symbols(s,n)
#define md_swapin_zsymbols(s,n) swap_zsymbols(s,n)
#define md_swapout_zsymbols(s,n) swap_zsymbols(s,n)
#define md_swapin__dynamic(l) swap__dynamic(l)
#define md_swapout__dynamic(l) swap__dynamic(l)
#define md_swapin_section_dispatch_table(l) swap_section_dispatch_table(l)
#define md_swapout_section_dispatch_table(l) swap_section_dispatch_table(l)
#define md_swapin_so_debug(d) swap_so_debug(d)
#define md_swapout_so_debug(d) swap_so_debug(d)
#define md_swapin_rrs_hash(f,n) swap_rrs_hash(f,n)
#define md_swapout_rrs_hash(f,n) swap_rrs_hash(f,n)
#define md_swapin_sod(l,n) swapin_sod(l,n)
#define md_swapout_sod(l,n) swapout_sod(l,n)
#define md_swapout_got(g,n) swap_longs((long*)(g),n)
#define md_swapin_ranlib_hdr(h,n) swap_ranlib_hdr(h,n)
#define md_swapout_ranlib_hdr(h,n) swap_ranlib_hdr(h,n)
#define md_swap_short(x) ( (((x) >> 8) & 0xff) | (((x) & 0xff) << 8) )
#define md_swap_long(x) ( (((x) >> 24) & 0xff ) | (((x) >> 8 ) & 0xff00 ) | \
(((x) << 8 ) & 0xff0000) | (((x) << 24) & 0xff000000))
#else /* We need not swap, but must pay attention to alignment: */
#define md_swap_short(x) (x)
#define md_swap_long(x) (x)
#endif /* NEED_SWAP */
#else /* Not a cross linker: use native */
#define md_swap_short(x) (x)
#define md_swap_long(x) (x)
#define get_byte(where) (*(char *)(where))
#define get_short(where) (*(short *)(where))
#define get_long(where) (*(long *)(where))
#define put_byte(where,what) (*(char *)(where) = (what))
#define put_short(where,what) (*(short *)(where) = (what))
#define put_long(where,what) (*(long *)(where) = (what))
#endif /* CROSS_LINKER */

View File

@ -0,0 +1,19 @@
/*
* PowerPC run-time link editor entry points.
*/
.text
.globl _binder, _binder_entry
/*
* _rtl(int version, struct crt_ldso *crtp)
*/
_rtl: /* crt0 calls us here */
ret
/*
* First call to a procedure generally comes through here for
* binding.
*/
_binder_entry:
ret

View File

@ -0,0 +1,17 @@
/*
* $NetBSD: md-static-funcs.c,v 1.1 1996/11/03 18:06:50 ws Exp $
*
* Called by ld.so when onanating.
* This *must* be a static function, so it is not called through a jmpslot.
*/
static void
md_relocate_simple(r, relocation, addr)
struct relocation_info *r;
long relocation;
char *addr;
{
if (r->r_relative)
*(long *)addr += relocation;
}

View File

@ -0,0 +1,287 @@
/* $NetBSD: md.c,v 1.1 1996/11/03 18:06:50 ws Exp $ */
/*
* Copyright (c) 1993 Paul Kranenburg
* All rights reserved.
*
* 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 Paul Kranenburg.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 <sys/param.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <err.h>
#include <fcntl.h>
#include <a.out.h>
#include <stab.h>
#include <string.h>
#include "ld.h"
static int reloc_target_rightshift[] = {
-1, 0, 2, 0, 0, 16, 16, 2,
-1, -1, 2, 2, -1, -1, 0, 0,
16, 16, 2, -1, -1, -1, -1, -1,
-1, -1, 0, 0, 0, 0, 16, 16
};
static int reloc_target_bitpos[] = {
-1, 0, 2, 0, 0, 0, 0, 2,
-1, -1, 2, 2, -1, -1, 0, 0,
0, 0, 2, -1, -1, -1, -1, -1,
-1, -1, 0, 0, 0, 0, 0, 0
};
static int reloc_target_size[] = {
-1, 4, 4, 2, 2, 2, 2, 4,
-1, -1, 4, 4, -1, -1, 2, 2,
2, 2, 4, -1, -1, -1, -1, -1,
-1, -1, 4, 4, 4, 2, 2, 2
};
static int reloc_target_bitsize[] = {
-1, 32, 24, 16, 16, 16, 16, 14,
-1, -1, 24, 14, -1, -1, 16, 16,
16, 16, 24, -1, -1, -1, -1, -1,
-1, -1, 32, 32, 32, 16, 16, 16
};
/*
* Get relocation addend corresponding to relocation record RP
* from address ADDR
*/
long
md_get_addend(rp, addr)
struct relocation_info *rp;
unsigned char *addr;
{
return rp->r_addend;
}
/*
* Put RELOCATION at ADDR according to relocation record RP.
*/
void
md_relocate(rp, relocation, addr, relocatable_output)
struct relocation_info *rp;
long relocation;
unsigned char *addr;
int relocatable_output;
{
register unsigned long mask;
int ha_adj = 0;
if (relocatable_output) {
/*
* Store relocation where the next link-edit run
* will look for it.
*/
rp->r_addend = relocation;
return;
}
if (rp->r_type == RELOC_16_HA
|| rp->r_type == RELOC_GOT16_HA
|| rp->r_type == RELOC_PLT16_HA)
relocation += (relocation & 0x8000) << 1;
relocation >>= RELOC_VALUE_RIGHTSHIFT(rp);
/* Unshifted mask for relocation */
mask = 1 << RELOC_TARGET_BITSIZE(rp) - 1;
mask |= mask - 1;
relocation &= mask;
/* Shift everything up to where it's going to be used */
relocation <<= RELOC_TARGET_BITPOS(rp);
mask <<= RELOC_TARGET_BITPOS(rp);
switch (RELOC_TARGET_SIZE(rp)) {
case 4:
*(u_long *)addr &= ~mask;
*(u_long *)addr |= relocation;
break;
case 2:
*(u_short *)addr &= ~mask;
*(u_short *)addr |= relocation;
break;
default:
errx(1, "Unknown relocation type %d", rp->r_type);
}
}
#ifndef RTLD
/*
* Machine dependent part of claim_rrs_reloc().
* Set RRS relocation type.
*/
int
md_make_reloc(rp, r, type)
struct relocation_info *rp, *r;
int type;
{
r->r_type = rp->r_type;
r->r_addend = rp->r_addend;
if (RELOC_PCREL_P(rp))
r->r_addend -= pc_relocation;
return 1;
}
#endif
/*
* Set up a transfer from jmpslot at OFFSET (relative to the PLT table)
* to the binder slot (which is at offset 0 of the PLT).
*/
void
md_make_jmpslot(sp, offset, index)
jmpslot_t *sp;
long offset;
long index;
{
errx(1, "md_make_jmpslot unimplemented");
}
/*
* Set up a "direct" transfer (ie. not through the run-time binder) from
* jmpslot at OFFSET to ADDR. Used by `ld' when the SYMBOLIC flag is on,
* and by `ld.so' after resolving the symbol.
*/
void
md_fix_jmpslot(sp, offset, addr)
jmpslot_t *sp;
long offset;
u_long addr;
{
errx(1, "md_fix_jmpslot unimplemented");
}
/*
* Update the relocation record for a RRS jmpslot.
*/
void
md_make_jmpreloc(rp, r, type)
struct relocation_info *rp, *r;
int type;
{
errx(1, "md_make_jmpreloc unimplemented");
}
/*
* Set relocation type for a RRS GOT relocation.
*/
void
md_make_gotreloc(rp, r, type)
struct relocation_info *rp, *r;
int type;
{
errx(1, "md_make_gotreloc unimplemented");
}
/*
* Set relocation type for a RRS copy operation.
*/
void
md_make_cpyreloc(rp, r)
struct relocation_info *rp, *r;
{
errx(1, "md_make_cpyreloc unimplemented");
}
void
md_set_breakpoint(where, savep)
long where;
long *savep;
{
*savep = *(long *)where;
*(char *)where = TRAP;
}
#ifndef RTLD
/*
* Initialize (output) exec header such that useful values are
* obtained from subsequent N_*() macro evaluations.
*/
void
md_init_header(hp, magic, flags)
struct exec *hp;
int magic, flags;
{
N_SETMAGIC((*hp), magic, MID_MACHINE, flags);
/* TEXT_START depends on the value of outheader.a_entry. */
if (!(link_mode & SHAREABLE))
hp->a_entry = PAGSIZ;
}
#endif /* RTLD */
#ifdef NEED_SWAP
/*
* Byte swap routines for cross-linking.
*/
void
md_swapin_exec_hdr(h)
struct exec *h;
{
swap_longs((long *)h + 1, sizeof(*h)/sizeof(long) - skip);
}
void
md_swapout_exec_hdr(h)
struct exec *h;
{
swap_longs((long *)h + 1, sizeof(*h)/sizeof(long) - skip);
}
void
md_swapin_reloc(r, n)
struct relocation_info *r;
int n;
{
errx(1, "md_swapin_reloc unimplemented");
}
void
md_swapout_reloc(r, n)
struct relocation_info *r;
int n;
{
errx(1, "md_swapout_reloc unimplemented");
}
void
md_swapout_jmpslot(j, n)
jmpslot_t *j;
int n;
{
errx(1, "md_swapout_jmpslot unimplemented");
}
#endif /* NEED_SWAP */

View File

@ -0,0 +1,223 @@
/* $NetBSD: md.h,v 1.1 1996/11/03 18:06:51 ws Exp $ */
/*
* Copyright (c) 1995 Wolfgang Solfrank
* Copyright (c) 1995 TooLs GmbH
* All rights reserved.
*
* 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 TooLs GmbH.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 TOOLS GMBH 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.
*/
#define MAX_ALIGNMENT (sizeof (double)) /* 32??? */
#define PAGSIZ __LDPGSZ
#define N_SET_FLAG(ex,f) N_SETMAGIC(ex, \
N_GETMAGIC(ex), \
MID_MACHINE, \
N_GETFLAG(ex)|(f))
#define N_IS_DYNAMIC(ex) ((N_GETFLAG(ex) & EX_DYNAMIC))
#define N_BADMID(ex) (N_GETMID(ex) != MID_MACHINE)
/*
* Should be handled by a.out.h ?
*/
#define N_ADJUST(ex) (((ex).a_entry < PAGSIZ) ? -PAGSIZ : 0)
#define TEXT_START(ex) (N_TXTADDR(ex) + N_ADJUST(ex))
#define DATA_START(ex) (N_DATADDR(ex) + N_ADJUST(ex))
#define RELOC_ADDRESS(r) ((r)->r_address)
#define RELOC_EXTERN_P(r) ((r)->r_extern)
#define RELOC_TYPE(r) ((r)->r_symbolnum)
#define RELOC_SYMBOL(r) ((r)->r_symbolnum)
#define RELOC_MEMORY_SUB_P(r) 0
#define RELOC_MEMORY_ADD_P(r) 0
#define RELOC_ADD_EXTRA(r) ((r)->r_addend)
#define RELOC_PCREL_P(r) \
(((r)->r_type >= RELOC_REL24 && (r)->r_type <= RELOC_REL14_NTAKEN) \
|| (r)->r_type == RELOC_PLT24 \
|| (r)->r_type == RELOC_REL32 \
|| (r)->r_type == RELOC_PLTREL32)
#define RELOC_VALUE_RIGHTSHIFT(r) (reloc_target_rightshift[(r)->r_type])
#define RELOC_TARGET_SIZE(r) (reloc_target_size[(r)->r_type])
#define RELOC_TARGET_BITPOS(r) (reloc_target_bitpos[(r)->r_type])
#define RELOC_TARGET_BITSIZE(r) (reloc_target_bitsize[(r)->r_type])
#define RELOC_JMPTAB_P(r) \
((r)->r_type == RELOC_PLT24 \
|| ((r)->r_type >= RELOC_PLT32 \
&& (r)->r_type <= RELOC_PLT16_HA))
#define RELOC_BASEREL_P(r) 0
#define RELOC_RELATIVE_P(r) ((r)->r_type == RELOC_RELATIVE)
#define RELOC_COPY_P(r) ((r)->r_type == RELOC_COPY)
#define RELOC_LAZY_P(r) ((r)->r_type == RELOC_JMP_SLOT)
#define RELOC_STATICS_THROUGH_GOT_P(r) 1
#define JMPSLOT_NEEDS_RELOC 1
#define CHECK_GOT_RELOC(r) \
((r)->r_type >= RELOC_16_LO \
&& (r)->r_type <= RELOC_16_HA)
#define md_got_reloc(r) (-(r)->r_address)
#define RELOC_INIT_SEGMENT_RELOC(r) ((r)->r_type = RELOC_32)
/* Width of a Global Offset Table entry */
typedef long got_t;
/*
* TO BE DONE!!!
*/
typedef struct jmpslot {
u_long opcode;
u_long addr;
u_long reloc_index;
#define JMPSLOT_RELOC_MASK 0xffffffff
} jmpslot_t;
#define NOP 0
#define CALL 0
#define JUMP 0
#define TRAP 0
/*
* Byte swap defs for cross linking
*/
#if !defined(NEED_SWAP)
#define md_swapin_exec_hdr(h)
#define md_swapout_exec_hdr(h)
#define md_swapin_symbols(s,n)
#define md_swapout_symbols(s,n)
#define md_swapin_zsymbols(s,n)
#define md_swapout_zsymbols(s,n)
#define md_swapin_reloc(r,n)
#define md_swapout_reloc(r,n)
#define md_swapin__dynamic(l)
#define md_swapout__dynamic(l)
#define md_swapin_section_dispatch_table(l)
#define md_swapout_section_dispatch_table(l)
#define md_swapin_so_debug(d)
#define md_swapout_so_debug(d)
#define md_swapin_rrs_hash(f,n)
#define md_swapout_rrs_hash(f,n)
#define md_swapin_sod(l,n)
#define md_swapout_sod(l,n)
#define md_swapout_jmpslot(j,n)
#define md_swapout_got(g,n)
#define md_swapin_ranlib_hdr(h,n)
#define md_swapout_ranlib_hdr(h,n)
#endif /* NEED_SWAP */
#ifdef CROSS_LINKER
#define get_byte(p) ( ((unsigned char *)(p))[0] )
#define get_short(p) ( ( ((unsigned char *)(p))[0] << 8) | \
( ((unsigned char *)(p))[1] ) \
)
#define get_long(p) ( ( ((unsigned char *)(p))[0] << 24) | \
( ((unsigned char *)(p))[1] << 16) | \
( ((unsigned char *)(p))[2] << 8 ) | \
( ((unsigned char *)(p))[3] ) \
)
#define put_byte(p, v) { ((unsigned char *)(p))[0] = ((unsigned long)(v)); }
#define put_short(p, v) { ((unsigned char *)(p))[0] = \
((((unsigned long)(v)) >> 8) & 0xff); \
((unsigned char *)(p))[1] = \
((((unsigned long)(v)) ) & 0xff); }
#define put_long(p, v) { ((unsigned char *)(p))[0] = \
((((unsigned long)(v)) >> 24) & 0xff); \
((unsigned char *)(p))[1] = \
((((unsigned long)(v)) >> 16) & 0xff); \
((unsigned char *)(p))[2] = \
((((unsigned long)(v)) >> 8) & 0xff); \
((unsigned char *)(p))[3] = \
((((unsigned long)(v)) ) & 0xff); }
#ifdef NEED_SWAP
/* Define IO byte swapping routines */
void md_swapin_exec_hdr __P((struct exec *));
void md_swapout_exec_hdr __P((struct exec *));
void md_swapin_reloc __P((struct relocation_info *, int));
void md_swapout_reloc __P((struct relocation_info *, int));
void md_swapout_jmpslot __P((jmpslot_t *, int));
#define md_swapin_symbols(s,n) swap_symbols(s,n)
#define md_swapout_symbols(s,n) swap_symbols(s,n)
#define md_swapin_zsymbols(s,n) swap_zsymbols(s,n)
#define md_swapout_zsymbols(s,n) swap_zsymbols(s,n)
#define md_swapin__dynamic(l) swap__dynamic(l)
#define md_swapout__dynamic(l) swap__dynamic(l)
#define md_swapin_section_dispatch_table(l) swap_section_dispatch_table(l)
#define md_swapout_section_dispatch_table(l) swap_section_dispatch_table(l)
#define md_swapin_so_debug(d) swap_so_debug(d)
#define md_swapout_so_debug(d) swap_so_debug(d)
#define md_swapin_rrs_hash(f,n) swap_rrs_hash(f,n)
#define md_swapout_rrs_hash(f,n) swap_rrs_hash(f,n)
#define md_swapin_sod(l,n) swapin_sod(l,n)
#define md_swapout_sod(l,n) swapout_sod(l,n)
#define md_swapout_got(g,n) swap_longs((long*)(g),n)
#define md_swapin_ranlib_hdr(h,n) swap_ranlib_hdr(h,n)
#define md_swapout_ranlib_hdr(h,n) swap_ranlib_hdr(h,n)
#define md_swap_short(x) ( (((x) >> 8) & 0xff) | (((x) & 0xff) << 8) )
#define md_swap_long(x) ( (((x) >> 24) & 0xff ) | (((x) >> 8 ) & 0xff00 ) | \
(((x) << 8 ) & 0xff0000) | (((x) << 24) & 0xff000000))
#else /* We need not swap, but must pay attention to alignment: */
#define md_swap_short(x) (x)
#define md_swap_long(x) (x)
#endif /* NEED_SWAP */
#else /* Not a cross linker: use native */
#define md_swap_short(x) (x)
#define md_swap_long(x) (x)
#define get_byte(where) (*(char *)(where))
#define get_short(where) (*(short *)(where))
#define get_long(where) (*(long *)(where))
#define put_byte(where,what) (*(char *)(where) = (what))
#define put_short(where,what) (*(short *)(where) = (what))
#define put_long(where,what) (*(long *)(where) = (what))
#endif /* CROSS_LINKER */

View File

@ -0,0 +1,19 @@
/*
* PowerPC run-time link editor entry points.
*/
.text
.globl _binder, _binder_entry
/*
* _rtl(int version, struct crt_ldso *crtp)
*/
_rtl: /* crt0 calls us here */
ret
/*
* First call to a procedure generally comes through here for
* binding.
*/
_binder_entry:
ret