Add machine dependent code for NetBSD/powerpc
This commit is contained in:
parent
648f041eb1
commit
79b6fe9805
4
gnu/usr.bin/gas/config/Makefile.powerpc
Normal file
4
gnu/usr.bin/gas/config/Makefile.powerpc
Normal 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
|
1312
gnu/usr.bin/gas/config/tc-powerpc.c
Normal file
1312
gnu/usr.bin/gas/config/tc-powerpc.c
Normal file
File diff suppressed because it is too large
Load Diff
54
gnu/usr.bin/gas/config/tc-powerpc.h
Normal file
54
gnu/usr.bin/gas/config/tc-powerpc.h
Normal 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
3073
gnu/usr.bin/gas/opcode/ppc.h
Normal file
File diff suppressed because it is too large
Load Diff
17
gnu/usr.bin/ld/arch/powerpc/md-static-funcs.c
Normal file
17
gnu/usr.bin/ld/arch/powerpc/md-static-funcs.c
Normal 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/arch/powerpc/md.c
Normal file
287
gnu/usr.bin/ld/arch/powerpc/md.c
Normal 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/arch/powerpc/md.h
Normal file
223
gnu/usr.bin/ld/arch/powerpc/md.h
Normal 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 */
|
19
gnu/usr.bin/ld/arch/powerpc/mdprologue.S
Normal file
19
gnu/usr.bin/ld/arch/powerpc/mdprologue.S
Normal 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
|
17
gnu/usr.bin/ld/powerpc/md-static-funcs.c
Normal file
17
gnu/usr.bin/ld/powerpc/md-static-funcs.c
Normal 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
287
gnu/usr.bin/ld/powerpc/md.c
Normal 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
223
gnu/usr.bin/ld/powerpc/md.h
Normal 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 */
|
19
gnu/usr.bin/ld/powerpc/mdprologue.S
Normal file
19
gnu/usr.bin/ld/powerpc/mdprologue.S
Normal 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
|
17
libexec/ld.aout_so/arch/powerpc/md-static-funcs.c
Normal file
17
libexec/ld.aout_so/arch/powerpc/md-static-funcs.c
Normal 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
libexec/ld.aout_so/arch/powerpc/md.c
Normal file
287
libexec/ld.aout_so/arch/powerpc/md.c
Normal 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
libexec/ld.aout_so/arch/powerpc/md.h
Normal file
223
libexec/ld.aout_so/arch/powerpc/md.h
Normal 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 */
|
19
libexec/ld.aout_so/arch/powerpc/mdprologue.S
Normal file
19
libexec/ld.aout_so/arch/powerpc/mdprologue.S
Normal 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
|
Loading…
Reference in New Issue
Block a user