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