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 }