1#include <stdio.h>2#include <stdlib.h>34#include <scc/mach.h>5#include <scc/coff32.h>67#include "objdump.h"89int10coff32hasrelloc(Obj *obj, Section *sec)11{12 struct coff32 *coff = obj->data;13 SCNHDR *scn = &coff->scns[sec->index];1415 return scn->s_nrelloc != 0;16}1718void19coff32syms(Obj *obj)20{21 long i;22 struct coff32 *coff = obj->data;23 FILHDR *hdr = &coff->hdr;2425 if (hdr->f_nsyms == 0) {26 puts("no symbols");27 return;28 }2930 for (i = 0; i < hdr->f_nsyms; i++) {31 SYMENT *ent;32 AUXENT *aux;33 Entry *ep = &coff->ents[i];3435 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}8687void88coff32scns(Obj *obj)89{90 int i;91 char *name;92 SCNHDR *scn;93 struct coff32 *coff = obj->data;94 FILHDR *hdr = &coff->hdr;9596 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}125126void127coff32fhdr(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;133134 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);140141 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 }158159 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}