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 }