scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | Submodules | README | 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 }