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 | E_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 <<= 2;
21 p += (ulong)b;
22 pp = (ulong*)p;
23 v = *pp;
24 switch(m){
25 case 0:
26 v += (ulong)b;
27 break;
28 case 1:
29 i = v>>22;
30 v &= 0x3fffff;
31 CHK(i, ntab);
32 v += tab[i]->addr;
33 break;
34 case 2:
35 i = v&0x3ff;
36 v &= ~0x3ff;
37 CHK(i, ntab);
38 v |= ((tab[i]->addr-p-8)>>2)&0xffffff;
39 break;
40 default:
41 return "invalid relocation mode";
42 }
43 *pp = v;
44 return nil;
45 }
46