1#include <stdio.h>23#include <scc/mach.h>4#include <scc/coff32.h>56#include "../libmach.h"7#include "fun.h"89Section *10coff32getsec(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;1819 if (n >= hdr->f_nscns)20 return NULL;2122 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 }8283 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;9394 return sec;95}