coff32getsym.c - 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
---
coff32getsym.c (1292B)
---
1 #include <ctype.h>
2 #include <stdio.h>
3 #include <string.h>
4
5 #include <scc/mach.h>
6 #include <scc/coff32.h>
7
8 #include "../libmach.h"
9 #include "fun.h"
10
11 static int
12 typeof(Coff32 *coff, SYMENT *ent)
13 {
14 int c;
15 SCNHDR *scn;
16
17 switch (ent->n_scnum) {
18 case N_DEBUG:
19 c = 'N';
20 break;
21 case N_ABS:
22 c = 'a';
23 break;
24 case N_UNDEF:
25 c = (ent->n_value != 0) ? 'C' : 'U';
26 break;
27 default:
28 scn = &coff->scns[ent->n_scnum-1];
29
30 switch (scn->s_flags) {
31 case STYP_TEXT:
32 c = 't';
33 break;
34 case STYP_DATA:
35 c = 'd';
36 break;
37 case STYP_BSS:
38 c = 'b';
39 break;
40 case STYP_INFO:
41 c = 'N';
42 break;
43 case STYP_LIT:
44 c = 'r';
45 break;
46 default:
47 c = '?';
48 break;
49 }
50 }
51
52 if (ent->n_sclass == C_EXT)
53 c = toupper(c);
54
55 return c;
56 }
57
58 Symbol *
59 coff32getsym(Obj *obj, int *idx, Symbol *sym)
60 {
61 int n = *idx;
62 Entry *ep;
63 SYMENT *ent;
64 Coff32 *coff = obj->data;
65 FILHDR *hdr = &coff->hdr;
66
67 if ((hdr->f_flags & F_LSYMS) != 0 || n >= coff->hdr.f_nsyms)
68 return NULL;
69
70 ep = &coff->ents[n];
71 if (ep->type != SYM_ENT)
72 return NULL;
73 ent = &ep->u.sym;
74
75 sym->name = coff32str(coff, ent);
76 sym->type = typeof(coff, ent);
77 sym->stype = SYMOBJECT;
78 sym->value = ent->n_value;
79 sym->size = (sym->type == 'C') ? ent->n_value : 0;
80 sym->index = n;
81 *idx += ent->n_numaux;
82
83 return sym;
84 }