diff options
| author | svn2git <svn2git@FreeBSD.org> | 1994-05-01 08:00:00 +0000 | 
|---|---|---|
| committer | svn2git <svn2git@FreeBSD.org> | 1994-05-01 08:00:00 +0000 | 
| commit | a16f65c7d117419bd266c28a1901ef129a337569 (patch) | |
| tree | 2626602f66dc3551e7a7c7bc9ad763c3bc7ab40a /gnu/usr.bin/ld/sparc/md-static-funcs.c | |
| parent | 8503f4f13f77abf7adc8f7e329c6f9c1d52b6a20 (diff) | |
Diffstat (limited to 'gnu/usr.bin/ld/sparc/md-static-funcs.c')
| -rw-r--r-- | gnu/usr.bin/ld/sparc/md-static-funcs.c | 37 | 
1 files changed, 37 insertions, 0 deletions
diff --git a/gnu/usr.bin/ld/sparc/md-static-funcs.c b/gnu/usr.bin/ld/sparc/md-static-funcs.c new file mode 100644 index 000000000000..8446daa5256c --- /dev/null +++ b/gnu/usr.bin/ld/sparc/md-static-funcs.c @@ -0,0 +1,37 @@ + +/* + *	$Id: md-static-funcs.c,v 1.2 1993/12/11 12:02:08 jkh Exp $ + * + * Simple SPARC relocations for the benefit of self-relocation of ld.so + * avoiding the use of global variables (ie. reloc_bitshift[] et. al.). + * Only types supported are RELOC_32 and RELOC_RELATIVE. + * + * 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; +{ +	register unsigned long	mask; +	register unsigned long	shift; + +	switch (r->r_type) { +	case RELOC_32: +		mask = 0xffffffff; +		shift = 0; +		break; +	case RELOC_RELATIVE: +		mask = 0x003fffff; +		shift = 10; +		break; +	} +	relocation += (*(long *)addr & mask) << shift; +	relocation >>= shift; +	relocation &= mask; + +	*(long *) (addr) &= ~mask; +	*(long *) (addr) |= relocation; +} +  | 
