blob: e73fa50b4688439fe1d4dfbe72d22ca75ba50c2f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
/* * $OpenBSD: md-static-funcs.c,v 1.4 2002/07/19 19:28:12 marc 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(struct relocation_info *r, long relocation, char *addr)
{
unsigned long mask;
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;
}
|