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