scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | Submodules | README | LICENSE

coff32getsec.c (1699B)


      1 #include <stdio.h>
      2 
      3 #include <scc/mach.h>
      4 #include <scc/coff32.h>
      5 
      6 #include "../libmach.h"
      7 #include "fun.h"
      8 
      9 Section *
     10 coff32getsec(Obj *obj, int *idx, Section *sec)
     11 {
     12 	long n = *idx;
     13 	int type;
     14 	unsigned sflags;
     15 	SCNHDR *scn;
     16 	Coff32 *coff = obj->data;
     17 	FILHDR *hdr = &coff->hdr;
     18 
     19 	if (n >= hdr->f_nscns)
     20 		return NULL;
     21 
     22 	scn = &coff->scns[n];
     23 	switch (scn->s_flags) {
     24 	case STYP_REG:
     25 		type = 'D';
     26 		sflags = SALLOC | SRELOC | SLOAD | SWRITE | SREAD;
     27 		break;
     28 	case STYP_DSECT:
     29 		type = '?';
     30 		sflags = SRELOC;
     31 		break;
     32 	case STYP_NOLOAD:
     33 		type = 'D';
     34 		sflags = SALLOC | SREAD | SWRITE;
     35 		break;
     36 	case TYP_REVERSE_PAD:
     37 	case STYP_PAD:
     38 		type = '?';
     39 		sflags = SLOAD;
     40 		break;
     41 	case STYP_COPY:
     42 		type = '?';
     43 		sflags |= SLOAD | SRELOC;
     44 		break;
     45 	case STYP_TEXT:
     46 		type = 'T';
     47 		sflags = SALLOC | SRELOC | SLOAD | SEXEC | SREAD | SWRITE;
     48 		break;
     49 	case STYP_DATA:
     50 		type = 'D';
     51 		sflags = SALLOC | SRELOC | SLOAD | SWRITE | SREAD;
     52 		break;
     53 	case STYP_BSS:
     54 		type = 'B';
     55 		sflags = SALLOC | SREAD | SWRITE;
     56 		break;
     57 	case STYP_TEXT | STYP_DATA:
     58 		type = 'D';
     59 		sflags = SEXEC | SALLOC | SRELOC | SLOAD | SREAD | SWRITE;
     60 		break;
     61 	case STYP_LIT:
     62 	case STYP_RDATA:
     63 		type = 'D';
     64 		sflags = SALLOC | SRELOC | SLOAD | SREAD;
     65 		break;
     66 	case STYP_LIB:
     67 	case STYP_INFO:
     68 		type = 'N';
     69 		sflags = 0;
     70 		break;
     71 	case STYP_OVER:
     72 		type = '?';
     73 		sflags = SRELOC;
     74 		break;
     75 	case STYP_GROUP:
     76 	case STYP_MERGE:
     77 	default:
     78 		type = '?';
     79 		sflags = 0;
     80 		break;
     81 	}
     82 
     83 	sec->name = coff32str(coff, scn);
     84 	sec->index = n;
     85 	sec->size = scn->s_size;
     86 	sec->load = scn->s_vaddr;
     87 	sec->base = scn->s_paddr;
     88 	sec->offset = scn->s_scnptr;
     89 	sec->type = type;
     90 	sec->flags = sflags;
     91 	sec->align = 4;
     92 	sec->fill = 0;
     93 
     94 	return sec;
     95 }