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#include <stdlib.h>
  3
  4#include <scc/mach.h>
  5#include <scc/coff32.h>
  6
  7#include "objdump.h"
  8
  9int
 10coff32hasrelloc(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
 18void
 19coff32syms(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
 87void
 88coff32scns(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
126void
127coff32fhdr(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}