scc

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