mach.h - scc - simple c99 compiler
(HTM) git clone git://git.simple-cc.org/scc
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Submodules
(DIR) README
(DIR) LICENSE
---
mach.h (3150B)
---
1 /*
2 * some systems define macros with this name even when
3 * they should be c99 compliant.
4 */
5 #undef LITTLE_ENDIAN
6 #undef BIG_ENDIAN
7
8 #define NBYTES 32
9 #define OBJ(format,arch,order) ((order) << 10 | (arch) << 5 | (format))
10 #define FORMAT(t) ((t) & 0x1f)
11 #define ARCH(t) (((t) >> 5) & 0x1f)
12 #define ORDER(t) (((t) >> 10) & 0x1f)
13 #define objfmt(o) FORMAT((o)->type)
14
15 typedef struct section Section;
16 typedef struct symbol Symbol;
17 typedef struct obj Obj;
18 typedef struct map Map;
19 typedef struct mapsec Mapsec;
20
21 enum objformat {
22 COFF32,
23 ELF,
24 NFORMATS,
25 };
26
27 enum objarch {
28 ARCH286,
29 ARCH386,
30 ARCHAMD64,
31 ARCHZ80,
32 ARCHARM32,
33 ARCHARM64,
34 ARCHUNK32,
35 ARCHUNK64,
36 };
37
38 enum order {
39 LITTLE_ENDIAN,
40 BIG_ENDIAN,
41 };
42
43 /**
44 * enum sectype - Section property flags
45 * @SREAD: The segment has read rights
46 * @SWRITE: The segment has write rights
47 * @SEXEC: The segment has execution rights
48 * @SLOAD: Segment data is loaded from disk to memory
49 * @SALLOC: Segment is allocated in memory
50 * @SRELOC: Segment has to be relocated
51 * @SABS: Segment is loaded in a specific address
52 */
53 enum sectype {
54 SREAD = 1 << 0,
55 SWRITE = 1 << 1,
56 SEXEC = 1 << 2,
57 SLOAD = 1 << 3,
58 SALLOC = 1 << 4,
59 SRELOC = 1 << 5,
60 SABS = 1 << 6,
61 };
62
63 enum symtype {
64 SYMNOTYPE,
65 SYMOBJECT,
66 SYMFUNC,
67 SYMSECTION,
68 SYMFILE,
69 SYMCOMMON,
70 };
71
72 struct ar_hdr;
73
74 struct obj {
75 char *index;
76 int type;
77 long pos;
78 void *data;
79 Obj *next;
80 };
81
82 struct section {
83 char *name;
84 unsigned long long base;
85 unsigned long long load;
86 unsigned long long size;
87 long offset;
88
89 unsigned flags;
90 int index;
91 int align;
92 int fill;
93 char type;
94 };
95
96 #ifdef stdin
97 struct mapsec {
98 Section sec;
99 int used;
100 int loaded;
101 FILE *fp;
102 long fsiz;
103
104 int nchild;
105 struct mapsec **child;
106 };
107 #endif
108
109 struct map {
110 int nsec, nseg;
111 struct mapsec *sec;
112 struct mapsec *seg;
113 };
114
115 /**
116 * @stype: Used internally by libmach
117 * @dtype: Coff debug type
118 * @flags: Used only by the assembler
119 */
120 struct symbol {
121 char *name;
122 unsigned long long size;
123 unsigned long long value;
124 int index;
125 int section;
126 char type;
127 int stype;
128 int dtype;
129 unsigned flags;
130 };
131
132 #ifdef stdin
133 extern int archive(FILE *);
134 extern long armember(FILE *, char *, struct ar_hdr *);
135
136 extern int objprobe(FILE *, char **);
137 extern int objpos(Obj *, FILE *, long);
138
139 extern int readobj(Obj *, FILE *);
140 extern int writeobj(Obj *, Map *, FILE *);
141
142 extern Map *loadmap(Obj *, FILE *);
143
144 extern int mapsec(Map *, Section *, FILE *, long);
145 extern int mapseg(Map *, Section *, FILE *, long);
146
147 extern int setindex(int, long, char **, long *, FILE *);
148 extern int getindex(int, long *, char ***, long **, FILE *);
149
150 #endif
151
152 extern Map *newmap(int, int);
153 extern Map *remap(Map *, int, int);
154 extern void delmap(Map *);
155
156 extern int objtype(char *);
157 extern Obj *newobj(int);
158 extern void delobj(Obj *);
159
160 extern int strip(Obj *);
161 extern int pc2line(Obj *, unsigned long long, char *, int *);
162 extern int rebase(Obj *, int, unsigned long long);
163
164 extern int findsec(Map *, char *);
165
166 extern Symbol *getsym(Obj *, int *, Symbol *);
167 extern Symbol *setsym(Obj *, int *, Symbol *);
168 extern Section *getsec(Obj *, int *, Section *);
169 extern Section *setsec(Obj *, int *, Section *);