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