xref: /plan9-contrib/sys/src/libdynld/dynld-386.c (revision 50f1557124e7462c91000f47378638e1dd5a6016)
1 #include <u.h>
2 #include <libc.h>
3 #include <a.out.h>
4 #include <dynld.h>
5 
6 #define	CHK(i,ntab)	if((unsigned)(i)>=(ntab))return "bad relocation index"
7 
8 long
dynmagic(void)9 dynmagic(void)
10 {
11 	return DYN_MAGIC | I_MAGIC;
12 }
13 
14 char*
dynreloc(uchar * b,ulong p,int m,Dynsym ** tab,int ntab)15 dynreloc(uchar *b, ulong p, int m, Dynsym **tab, int ntab)
16 {
17 	int i;
18 	ulong v, *pp;
19 
20 	p += (ulong)b;
21 	pp = (ulong*)p;
22 	v = *pp;
23 	switch(m){
24 	case 0:
25 		v += (ulong)b;
26 		break;
27 	case 1:
28 		i = v>>22;
29 		v &= 0x3fffff;
30 		CHK(i, ntab);
31 		v += tab[i]->addr;
32 		break;
33 	case 2:
34 		i = v>>22;
35 		CHK(i, ntab);
36 		v = tab[i]->addr -p-4;
37 		break;
38 	default:
39 		return "bad relocation mode";
40 	}
41 	*pp = v;
42 	return nil;
43 }
44