FreeCalypso > hg > freecalypso-reveng
diff ticoff/basics.c @ 74:2eef88395908
tiobjd: a little refactoring
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Tue, 25 Mar 2014 18:55:36 +0000 |
parents | 10f3fbff5e97 |
children | 1a23ff9a81de |
line wrap: on
line diff
--- a/ticoff/basics.c Tue Mar 25 18:34:03 2014 +0000 +++ b/ticoff/basics.c Tue Mar 25 18:55:36 2014 +0000 @@ -1,98 +1,16 @@ /* - * This C module implements the "basics" of TI COFF image analysis. + * This C module implements some "basic" dump commands */ #include <sys/types.h> -#include <sys/file.h> -#include <sys/stat.h> -#include <sys/mman.h> #include <stdio.h> #include <stdlib.h> -#include <unistd.h> #include <time.h> #include "filestruct.h" +#include "intstruct.h" #include "globals.h" -mmap_objfile() -{ - int fd; - struct stat st; - - fd = open(objfilename, O_RDONLY); - if (fd < 0) { - perror(objfilename); - exit(1); - } - fstat(fd, &st); - if (!S_ISREG(st.st_mode)) { - fprintf(stderr, "error: %s is not a regular file\n", - objfilename); - exit(1); - } - objfile_tot_size = st.st_size; - filemap = mmap(NULL, objfile_tot_size, PROT_READ, MAP_PRIVATE, fd, 0L); - if (filemap == MAP_FAILED) { - perror("mmap"); - exit(1); - } - close(fd); -} - -unsigned -get_u16(ptr) - u_char *ptr; -{ - return ptr[0] | ptr[1] << 8; -} - -get_s16(ptr) - u_char *ptr; -{ - int i; - - i = ptr[0] | ptr[1] << 8; - if (i >= 32768) - i -= 65536; - return(i); -} - -unsigned -get_u32(ptr) - u_char *ptr; -{ - return ptr[0] | ptr[1] << 8 | ptr[2] << 16 | ptr[3] << 24; -} - -initial_parse_hdr() -{ - unsigned symtab_offset; - - filehdr_struct = (struct external_filehdr *) filemap; - if (get_u16(filehdr_struct->f_magic) != 0xC2) { - fprintf(stderr, "error: %s is not a TI COFF2 object\n", - objfilename); - exit(1); - } - if (get_u16(filehdr_struct->f_target_id) != 0x97) { - fprintf(stderr, "error: TI COFF object %s is not for TMS470\n", - objfilename); - exit(1); - } - if (get_u16(filehdr_struct->f_opthdr)) { - fprintf(stderr, - "error: %s has the \"optional\" header present\n", - objfilename); - exit(1); - } - sections_raw = (struct external_scnhdr *) - (filemap + sizeof(struct external_filehdr)); - nsections = get_u16(filehdr_struct->f_nscns); - symtab_offset = get_u32(filehdr_struct->f_symptr); - symtab_raw = (struct external_syment *)(filemap + symtab_offset); - nsymtab = get_u32(filehdr_struct->f_nsyms); - strtab_offset = symtab_offset + - sizeof(struct external_syment) * nsymtab; -} +extern unsigned get_u16(), get_u32(); dump_filehdr_info() { @@ -108,3 +26,19 @@ printf("%u sections, %u symtab entries\n", nsections, nsymtab); return(0); } + +cmd_sechdr() +{ + unsigned n; + struct internal_scnhdr *inf; + + get_int_section_table(); + for (n = 0; n < nsections; n++) { + inf = sections + n; + printf("#%d: %s size=%u, flags=0x%x\n", n, inf->name, + inf->size, inf->flags); + printf("\t%u reloc, %u line entries\n", + inf->nreloc, inf->nlineent); + } + exit(0); +}