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 }