|
|
1.1 root 1: /*
2: * Relocatable object (from translator)
3: * header
4: * summary segment; contains sizes of loadable segments
5: * loadable segments (possibly fragmented)
6: * relocation fragment follows each relocatable fragment
7: * symbol segment (seek address is seg_off[SYMBOLS] in summary)
8: * (see below)
9: */
10:
11: #ifndef RELOC_H
12: #define RELOC_H RELOC_H
13:
14: #include <types.h>
15: typedef unsigned long uaddr_t;
16: #define canuaddr(x) canlong(x)
17:
18: /*
19: * Object header
20: */
21: #define REL_OBJ "(Reloc)"
22:
23: typedef struct objhdr_t { /* object module header */
24: char obj_type[8], /* REL_OBJ, BND_OBJ etc. */
25: obj_hware[8], /* target hardware */
26: obj_sware[8], /* program that produced object */
27: obj_vers[8]; /* version of above */
28: } objhdr_t;
29:
30: /*
31: * Segment types
32: */
33:
34: /* vertically encoded */
35: #define Xb 0x01 /* execute */
36: #define Wb 0x02 /* write */
37: #define Sb 0x04 /* shared */
38: #define Bb 0x08 /* block */
39: #define Cb 0x10 /* common */
40: #define Db Bb /* expand downwards (output only) */
41: #define Lb Cb /* loadable (output only) */
42:
43: /* ordinary segments */
44: #define PURCODE (Xb)
45: #define PURDATA (0)
46: #define SHRCODE (Sb|Wb|Xb) /* shared => writeable */
47: #define SHRDATA (Sb|Wb)
48: #define OWNCODE (Wb|Xb)
49: #define OWNDATA (Wb)
50: #define PLCODE (Bb|Sb|Wb|Xb) /* pooled => shared block */
51: #define PLDATA (Bb|Sb|Wb)
52: #define BLCODE (Bb|Wb|Xb)
53: #define BLDATA (Bb|Wb)
54:
55: /* meanings of otherwise meaningless bit combinations */
56: /* these take clever advantage of the order of the bits */
57: #define STRINGS (Sb)
58: #define DEBUG (Sb|Xb)
59: #define SYMBOLS (Bb)
60: #define TYPESYM (Bb|Xb)
61: #define ABSLUTE (Bb|Sb)
62: #define RELOCN (Bb|Sb|Xb)
63: #define SUMMARY (Cb)
64: #define LASTSEG (0xFF)
65:
66: typedef struct summseg_t { /* summary segment */
67: unsigned char seg_type; /* SUMMARY */
68: fsize_t seg_size; /* sizeof (seg_off) */
69: fsize_t seg_off[SUMMARY];
70: } summseg_t;
71:
72: typedef struct segment_t { /* general segment fragment */
73: unsigned char seg_type;
74: fsize_t seg_size;
75: unsigned char seg_data[];
76: } segment_t;
77:
78: /*
79: * A relocation fragment contains relocation items.
80: * Relocation type specifies the byte layout of the relocated word.
81: * The name defined for each layout is intended to suggest the number
82: * of bytes in the word, and their significance in increasing order
83: * when read in address order.
84: */
85: #define B_0 0
86: #define B_01 ((0<<2)|1)
87: #define B_10 ((1<<2)|0)
88: #define B_012 ((0<<4)|(1<<2)|2)
89: #define B_210 ((2<<4)|(1<<2)|0)
90: #define B_0123 ((0<<6)|(1<<4)|(2<<2)|3)
91: #define B_3210 ((3<<6)|(2<<4)|(1<<2)|0)
92: #define B_2301 ((2<<6)|(3<<4)|(0<<2)|1)
93: #define B_1032 ((1<<6)|(0<<4)|(3<<2)|2)
94:
95: /* relocation flags (in rel_seg) */
96: #define PCREL 0x40
97: #define RELFLAGS (SIGNEDt|PCREL)
98:
99: typedef struct reloctn_t { /* relocation item */
100: unsigned char rel_type, /* byte layout of relocated word */
101: rel_seg; /* segment referenced by relocator */
102: uaddr_t rel_addr; /* address of relocation */
103: /* uaddr_t rel_num; symbol num if rel_seg is SYMBOLS */
104: /* bias if rel_seg is ABSLUTE */
105: } reloctn_t;
106:
107: /*
108: * Symbol segment contains a symbol count, followed by that many symbols,
109: * numbered from 0, not necessarily in order.
110: */
111:
112: typedef union symbol_t { /* object symbol */
113: struct { /* relocatable */
114: unsigned char sym_scope; /* module, segment, load or ref */
115: uaddr_t sym_num; /* symbol number */
116: char sym_name[]; /* NUL terminated */
117: unsigned char sym_expr[]; /* absent if reference */
118: char sym_type[]; /* always present */
119: };
120: struct { /* bound or debug symbol */
121: unsigned char sym_seg; /* seg type */
122: uaddr_t sym_addr; /* value */
123: char sym_name[]; /* NUL terminated */
124: char sym_type[]; /* always present */
125: };
126: } symbol_t;
127:
128: typedef struct symseg_t { /* symbol segment */
129: unsigned char seg_type;
130: fsize_t seg_size;
131: uaddr_t seg_nsym;
132: symbol_t seg_sym[];
133: } symseg_t;
134:
135: /* Symbol scope */
136: #define RFSCOPE 0 /* reference (undefined) */
137: #define LDSCOPE 1 /* whole load */
138: #define SGSCOPE 2 /* single segment */
139: #define MDSCOPE 3 /* single module */
140:
141: /*
142: * Symbol names are arbitrary length NUL ('\0') terminated character strings.
143: */
144: /*
145: * Symbol expression is a prefix polish representation of a binary tree
146: * i.e. (opr) (left expr) (right expr).
147: * No expression exists for undefined symbols (scope == RFSCOPE).
148: */
149:
150: typedef struct symleaf_t { /* expression tree leaf */
151: unsigned char seg_type;
152: uaddr_t sym_addr; /* relocatable address */
153: } symleaf_t;
154: /* If seg_type is SYMBOLS sym_addr is symbol number */
155:
156: /* Operators */
157: #define X_OP 0x80 /* distinguish opr from seg */
158: #define X_ADD (X_OP+1)
159: #define X_SUB (X_OP+2)
160: #define X_MUL (X_OP+3)
161: #define X_DIV (X_OP+4)
162: #define X_MOD (X_OP+5)
163: #define X_SHL (X_OP+6)
164: #define X_SRL (X_OP+7) /* shift right logical */
165: #define X_SRA (X_OP+8) /* shift right arithmetic */
166: #define X_MSK (X_OP+9) /* a msk b <=> a&~b */
167: #define X_AND (X_OP+10)
168: #define X_XOR (X_OP+11)
169: #define X_IOR (X_OP+12)
170:
171: typedef unsigned char symopr_t;
172:
173: /*
174: * Symbol type is tree represented as a NUL terminated string of leaves
175: * where a leaf is a character string, an n-byte signed or unsigned number,
176: * a type string, a type symbol, or special leaf ANYt.
177: * A character string is introduced by STRINGt, and is NUL terminated.
178: * A number consists of a byte count (or'd with SIGNEDt if signed),
179: * followed by that many bytes of data in order of increasing significance,
180: * with the sign (if any) at the top bit of the last byte.
181: * A type string is introduced by TYPEt, and is recursively defined as above.
182: * A type symbol is SYMBOLt followed by a symbol number (canonical uaddr_t)
183: * referring to the symbol segment in which the type was found.
184: */
185: #define ANYt (-2)
186: #define STRINGt (-3)
187: #define TYPEt (-4)
188: #define SYMBOLt (-5)
189: #define SIGNEDt (-1<<7)
190:
191: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.