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