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 }