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