scc

A fork of https://git.simple-cc.org/scc/ for Qute

git clone https://git.8pit.net/scc.git

 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
 9Section *
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;
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}