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