coff32.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
---
coff32.c (3949B)
---
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 #include <scc/mach.h>
5 #include <scc/coff32.h>
6
7 #include "objdump.h"
8
9 int
10 coff32hasrelloc(Obj *obj, Section *sec)
11 {
12 struct coff32 *coff = obj->data;
13 SCNHDR *scn = &coff->scns[sec->index];
14
15 return scn->s_nrelloc != 0;
16 }
17
18 void
19 coff32syms(Obj *obj)
20 {
21 long i;
22 struct coff32 *coff = obj->data;
23 FILHDR *hdr = &coff->hdr;
24
25 if (hdr->f_nsyms == 0) {
26 puts("no symbols");
27 return;
28 }
29
30 for (i = 0; i < hdr->f_nsyms; i++) {
31 SYMENT *ent;
32 AUXENT *aux;
33 Entry *ep = &coff->ents[i];
34
35 aux = &ep->u.aux;
36 switch (ep->type) {
37 case SYM_ENT:
38 ent = &ep->u.sym;
39 printf("[%4ld](sec %2d)(ty %4x)(scl %3d) (nx %d) 0x%04lX %s\n",
40 i,
41 ent->n_scnum,
42 ent->n_type,
43 ent->n_sclass,
44 ent->n_numaux,
45 ent->n_value,
46 coff32str(coff, ent));
47 break;
48 case SYM_AUX_UNK:
49 puts("AUX");
50 break;
51 case SYM_AUX_SYM:
52 printf("AUX tagndx %ld lnno %d size 0x%x lnnoptr %ld endndx %ld tv %d\n",
53 aux->x_tagndx,
54 aux->x_lnno,
55 aux->x_size,
56 aux->x_lnnoptr,
57 aux->x_endndx,
58 aux->x_tvndx);
59 break;
60 case SYM_AUX_FILE:
61 printf("File %s\n", coff32str(coff, aux));
62 break;
63 case SYM_AUX_SCN:
64 printf("AUX scnlen 0x%lx nreloc %d nlnno %d chk %lu ass %d comdat %d\n",
65 aux->x_scnlen,
66 aux->x_nreloc,
67 aux->x_nlinno,
68 aux->x_checksum,
69 aux->x_associated,
70 aux->x_comdat);
71 break;
72 case SYM_AUX_FUN:
73 printf("AUX tagndx %ld fsize 0x%lx lnnoptr %ld endndx %ld tv %d\n",
74 aux->x_fsize,
75 aux->x_tagndx,
76 aux->x_lnnoptr,
77 aux->x_endndx,
78 aux->x_tvndx);
79 break;
80 case SYM_AUX_ARY:
81 break;
82 abort();
83 }
84 }
85 }
86
87 void
88 coff32scns(Obj *obj)
89 {
90 int i;
91 char *name;
92 SCNHDR *scn;
93 struct coff32 *coff = obj->data;
94 FILHDR *hdr = &coff->hdr;
95
96 for (i = 0; i < hdr->f_nscns; i++) {
97 scn = &coff->scns[i];
98 name = coff32str(coff, scn);
99 if (!selected(name))
100 continue;
101 printf("\nscnhdr: %d\n"
102 "\tname: %s\n"
103 "\ts_paddr: 0x%04lx\n"
104 "\ts_vaddr: 0x%04lx\n"
105 "\ts_size: 0x%04lx\n"
106 "\ts_scnptr: %ld\n"
107 "\ts_relptr: %ld\n"
108 "\ts_lnnoptr: %ld\n"
109 "\ts_nrelloc: %u\n"
110 "\ts_nlnno: %u\n"
111 "\ts_flags: %#lx\n",
112 i,
113 name,
114 scn->s_paddr,
115 scn->s_vaddr,
116 scn->s_size,
117 scn->s_scnptr,
118 scn->s_relptr,
119 scn->s_lnnoptr,
120 scn->s_nrelloc,
121 scn->s_nlnno,
122 scn->s_flags);
123 }
124 }
125
126 void
127 coff32fhdr(Obj *obj, unsigned long long *start, Flags *f)
128 {
129 unsigned flags;
130 struct coff32 *coff = obj->data;
131 FILHDR *hdr = &coff->hdr;
132 AOUTHDR *aout = &coff->aout;
133
134 flags = hdr->f_flags;
135 setflag(f, (flags & F_RELFLG) == 0, HAS_RELOC);
136 setflag(f, (flags & F_LMNO) == 0, HAS_LINENO);
137 setflag(f, (flags & F_LSYMS) == 0, HAS_LOCALS);
138 setflag(f, hdr->f_nsyms > 0, HAS_SYMS);
139 setflag(f, flags & F_EXEC, EXEC_P);
140
141 if (pflag) {
142 printf("FILEHDR:\n"
143 "\tf_magic: %#x\n"
144 "\tf_nscns: %u\n"
145 "\tf_timdat: %ld\n"
146 "\tf_symptr: %ld\n"
147 "\tf_nsyms: %ld\n"
148 "\tf_opthdr: %u\n"
149 "\tf_flags: 0x%04x\n\n",
150 hdr->f_magic,
151 hdr->f_nscns,
152 hdr->f_timdat,
153 hdr->f_symptr,
154 hdr->f_nsyms,
155 hdr->f_opthdr,
156 hdr->f_flags);
157 }
158
159 if (hdr->f_opthdr > 0) {
160 *start = aout->entry;
161 if (pflag) {
162 printf("AOUTHDR:\n"
163 "\tmagic: %x\n"
164 "\tvstamp: %x\n"
165 "\ttsize: %04lx\n"
166 "\tdsize: %04lx\n"
167 "\tbsize: %04lx\n"
168 "\tentry: %04lx\n"
169 "\ttext_start: %04lx\n"
170 "\tdata_start: %04lx\n\n",
171 aout->magic,
172 aout->vstamp,
173 aout->tsize,
174 aout->dsize,
175 aout->bsize,
176 aout->entry,
177 aout->text_start,
178 aout->data_start);
179 }
180 }
181 }