# HG changeset patch # User Michael Spacefalcon # Date 1395455362 0 # Node ID 6799a5c57a49f2aefb1dc2f7a545e0cb8596e609 # Parent 10de8a00c519a6a650ae370464826142d75cacc9 tiobjd started diff -r 10de8a00c519 -r 6799a5c57a49 .hgignore --- a/.hgignore Thu Mar 13 09:05:18 2014 +0000 +++ b/.hgignore Sat Mar 22 02:29:22 2014 +0000 @@ -23,3 +23,5 @@ ^pirollback/dumpjournal$ ^pirollback/inopath$ ^pirollback/rollback$ + +^ticoff/tiobjd$ diff -r 10de8a00c519 -r 6799a5c57a49 ticoff/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ticoff/Makefile Sat Mar 22 02:29:22 2014 +0000 @@ -0,0 +1,15 @@ +CC= gcc +CFLAGS= -O2 +PROG= tiobjd +OBJS= basics.o globals.o main.o +HDRS= filestruct.h globals.h + +all: ${PROG} + +${PROG}: ${OBJS} + ${CC} -o $@ ${OBJS} + +${OBJS}: ${HDRS} + +clean: + rm -f *.o ${PROG} *err diff -r 10de8a00c519 -r 6799a5c57a49 ticoff/README --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ticoff/README Sat Mar 22 02:29:22 2014 +0000 @@ -0,0 +1,6 @@ +Here I'm going to build a standalone tool that reads linkable (not final) +object modules produced by TI's TMS470 toolchain, as found in GSM firmware +semi-sources, and produces disassembly listings that are well-fit for +understanding the function and interfaces of each object blob, and ultimately +replacing each of these blobs with functionally and interface-equivalent +new C code. diff -r 10de8a00c519 -r 6799a5c57a49 ticoff/basics.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ticoff/basics.c Sat Mar 22 02:29:22 2014 +0000 @@ -0,0 +1,99 @@ +/* + * This C module implements the "basics" of TI COFF image analysis. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "filestruct.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; +} + +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; +} + +dump_filehdr_info() +{ + time_t timestamp; + struct tm *timedec; + + timestamp = get_u32(filehdr_struct->f_timdat); + timedec = gmtime(×tamp); + printf("timestamp: %d-%02d-%02dT%02d:%02d:%02dZ\n", + timedec->tm_year + 1900, timedec->tm_mon + 1, timedec->tm_mday, + timedec->tm_hour, timedec->tm_min, timedec->tm_sec); + printf("file flags: 0x%x\n", get_u16(filehdr_struct->f_flags)); + printf("%u sections, %u symtab entries\n", nsections, nsymtab); + return(0); +} diff -r 10de8a00c519 -r 6799a5c57a49 ticoff/filestruct.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ticoff/filestruct.h Sat Mar 22 02:29:22 2014 +0000 @@ -0,0 +1,39 @@ +/* + * Here we are going to define the structures found in the COFF artifact + * file to be analyzed. + */ + +struct external_filehdr { + u_char f_magic[2]; /* magic number */ + u_char f_nscns[2]; /* number of sections */ + u_char f_timdat[4]; /* time & date stamp */ + u_char f_symptr[4]; /* file pointer to symtab */ + u_char f_nsyms[4]; /* number of symtab entries */ + u_char f_opthdr[2]; /* sizeof(optional hdr) */ + u_char f_flags[2]; /* flags */ + u_char f_target_id[2]; /* magic no. (TI COFF-specific) */ +}; + +struct external_scnhdr { + u_char s_name[8]; /* section name */ + u_char s_paddr[4]; /* physical address, aliased s_nlib */ + u_char s_vaddr[4]; /* virtual address */ + u_char s_size[4]; /* section size (in WORDS) */ + u_char s_scnptr[4]; /* file ptr to raw data for section */ + u_char s_relptr[4]; /* file ptr to relocation */ + u_char s_lnnoptr[4]; /* file ptr to line numbers */ + u_char s_nreloc[4]; /* number of relocation entries */ + u_char s_nlnno[4]; /* number of line number entries*/ + u_char s_flags[4]; /* flags */ + u_char s_reserved[2]; /* reserved */ + u_char s_page[2]; /* section page number (LOAD) */ +}; + +struct external_syment { + u_char e_name[8]; + u_char e_value[4]; + u_char e_scnum[2]; + u_char e_type[2]; + u_char e_sclass; + u_char e_numaux; +}; diff -r 10de8a00c519 -r 6799a5c57a49 ticoff/globals.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ticoff/globals.c Sat Mar 22 02:29:22 2014 +0000 @@ -0,0 +1,17 @@ +/* + * Definitions of global vars for the tiobjd program. + */ + +#include +#include "filestruct.h" + +char *objfilename; +u_char *filemap; +size_t objfile_tot_size; + +struct external_filehdr *filehdr_struct; +struct external_scnhdr *sections_raw; +unsigned nsections; +struct external_syment *symtab_raw; +unsigned nsymtab; +unsigned strtab_offset; diff -r 10de8a00c519 -r 6799a5c57a49 ticoff/globals.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ticoff/globals.h Sat Mar 22 02:29:22 2014 +0000 @@ -0,0 +1,14 @@ +/* + * extern declarations of global vars for the tiobjd program. + */ + +extern char *objfilename; +extern u_char *filemap; +extern size_t objfile_tot_size; + +extern struct external_filehdr *filehdr_struct; +extern struct external_scnhdr *sections_raw; +extern unsigned nsections; +extern struct external_syment *symtab_raw; +extern unsigned nsymtab; +extern unsigned strtab_offset; diff -r 10de8a00c519 -r 6799a5c57a49 ticoff/main.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ticoff/main.c Sat Mar 22 02:29:22 2014 +0000 @@ -0,0 +1,44 @@ +/* + * tiobjd main() function and command dispatch + */ + +#include +#include +#include +#include +#include +#include "filestruct.h" +#include "globals.h" + +extern int dump_filehdr_info(); + +static struct cmdtab { + char *cmd; + int (*func)(); +} cmdtab[] = { + {"hdr", dump_filehdr_info}, + {0, 0} +}; + +main(argc, argv) + char **argv; +{ + struct cmdtab *tp; + + if (argc != 3) { + fprintf(stderr, "usage: %s \n", argv[0]); + exit(1); + } + objfilename = argv[1]; + mmap_objfile(); + initial_parse_hdr(); + for (tp = cmdtab; tp->cmd; tp++) + if (!strcmp(tp->cmd, argv[2])) + break; + if (!tp->func) { + fprintf(stderr, "\"%s\": unknown or unimplemented command\n", + argv[2]); + exit(1); + } + return tp->func(); +}