cldlod 775 146 144 40000 5151211616 5332 þíúÎh8__PAGEZERO Œ__TEXT __text__TEXT*ø  ø__fvmlib_init0__TEXT7 0 __fvmlib_init1__TEXT8<<__const__TEXT8<l<__cstring__TEXT:¨X¨__DATA@ __data__DATA@ __bss__DATA@__common__DATA@ ¼0,/usr/shlib/libsys_s.B.shlibX*ø Ožü .€#À@/H#È@R€å€ÑÀ/H#È@aÿHJ¹°g y°NJ¹¤g y¤NJ¹@ gaÿÎB¹°aÿ>.€aÿÿùJNqNVÿü-|7 ÿüNq ®8<ÿüd nÿü h"nÿü ‘P®ÿü`âN^NuNV/ $n Hy6ZHxaÿÌPOr²®g Hy:¨Hy(aÿÿù`HxÿÿaÿÿøØÞü Hy:É/*aÿÿù0#À@ POf/*Hy:Ìaÿ –POaÿ /9@ aÿÿøºB§aÿÿøŽ$nÿüN^NuNVaÿŠaÿÀJ¹@$gJ¹@(gaÿBaÿ¼J¹@$gJ¹@(gaÿn/9@D/9@lHy:æHyaÿ âN^NuNVÿàHç80B‚(<ÿÿý;B§/9@$/9@ aÿÿø¬Þü J€gHy:ôaÿ ÖXO´¹@(ldvàÖŽ/9@ HxHx /aÿ RÞür²€g/Hy;aÿ šPOHy;2/aÿöPOJ€fJ®ÿøf J®ÿôf(.ÿè` R‚´¹@(m Hy;7Hyaÿ &POJ„mRJ¹@pgJ$y@t6|¸‹g$/ aÿÎ @Gð¸EòˆXO 9@tй@p°ŠbØ/ Hy;?HyaÿÒÞü Hy;BHyaÿ¼Lî ÿÌN^NuNV/9@ HxHxHy@€aÿdÞür²€gHy;Eaÿ®XOAù@„#Ð@œ#è @(#è@$(VÀrÀ#À@  ¹Å@€fr#Á@¤r#Á@l`: ¹Æ@€fr` ¹Ç@€fr#Á@l#Á@¤`Hy;]aÿ(XOAù@”JgdJ¹@ g*/9@ Hx/Hy@0aÿœÞür²€g:Hy;{`,/9@ Hx/9@”Hy@°aÿnÞür²€g Hy;œaÿ¸rÒ¹@”#Á@ØN^NuNV/ 9@(ë€$@Õù@$B§/ /9@ aÿÿöBÞü J€gHy;»aÿlXO/9@ HxHxHy@paÿðÞür²€g y@ (fHy;Þaÿ,XO y@ (gB¹@p`~J¹@pgv 9@pY€#À@p/aÿÿùT#À@tB§Hj/9@ aÿÿõ ÞüJ€gHy;þaÿÊXO/9@ Hx/9@p/9@taÿÿõPÞür²€g Hy<aÿ–$nÿüN^NuNVÿÌHç0B‚´¹@œlxvÌÖŽB§/9@Ø/9@ aÿÿõ&Þü J€gHy<3aÿPXO/9@ HxHx4/aÿØÞür²€gHyEù<Õ`6Eù<×`.Eù<Û`&Eù<ß`Eù<ã`Eù<ç`Eù<ê`Eù<í",å/aÿÿöà&@B§/,/9@ aÿÿó0ÞüJ€g/Hy<õaÿXPO/9@ Hx/,/ aÿàÞür²€g/Hy=aÿ(PO,2g– Lf\//9@¤/,/9@l//9@lHy=>$</Eù6lN’Þü //9@¤/,/9@l//9@lHy=a/N’`ì//9@¤/,/9@l//9@l/ Hy=„Hyaÿ\`º//9@l/ Hy=¨Hyaÿv¶ªd &*¶¹@po 9@$ë€& –€/Hy>aÿ¤PO *Y€&@×ù@t .g *R€vk°ƒb |8¤ p NÐpÀªv°ƒb |:T p NÐ<F"9@#ê @ 9@v°ƒbÊ |:” p Nв¹@gHy?x`xp0Àªv ¶€fž²¹@gHy?–HyaÿÆPO/*/9@¤/ Hy?¡Hyaÿ¦`f²¹@g4Hy?³`²¹@g$Hy?¾`²¹@gHy?ÉHyaÿjPO/*/9@¤IÂ// Hy?ƒHyaÿF`#Á@Lî ÿðN^NuNV/././. /.aÿÿîîN^NuNVHxaÿÿîLN^NuNVAî "///aÿÿüÞü J€l Hy?ÔaÿN^NuNVHç80(9°Eî&Hy?ð$<(/Gù%.N“/ //aÿÿûÂHy=Ó/N“ÞüJ„g#İHy?ùaÿÿõ2XOHxaÿÿí²Lî ÿìN^Nu=jT=dP=^D=X@=R<$P8$J42–0$V,$D$,$&$ $>($\H$ $2$$$$8 (d.Äü@L@ô) ð)ì)è)ä%Fà)äÜ2„Ø-zÔ" Ð(úÌ$°È@À ´¼ Þ¸101¢1l1Ò2 1Ú1â1ê1ò1ú21:1D1N1X1b1ª1²1º1Â1Ê1v1€1Š1’1š5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5H5H5H5H5H5H5D5D5H5H5H5H5H5H5H5H5‚5Ì5Ü5ì5pusage: cldlod cldfile > lodfile rbcannot open input file %s _END %01.*X cannot seek to symbol tablecannot read symbol table entry %d.cmt_START %s cannot read file headerHeader has a bad magic numbercannot read optional file headercannot read linker file headercannot seek to string table lengthcannot read string table lengthcannot seek to string tablecannot read string tablecannot seek to section headerscannot read section headersinvalid string table offset for section header namePPAPBPEPIPRYYAYBYEYIYRXXAXBXEXIXRLLAALABLBALBBLELIcannot seek to raw data in section %scannot read raw data in section %s_BLOCKDATA X %01.*X %01.*X %01.*X _BLOCKDATA Y %01.*X %01.*X %01.*X _BLOCKDATA %s %01.*X %01.*X %01.*X _DATA %s %01.*X %01.*lX %01.*lX %01.*lX cannot read auxiliary entry %d for symbol entry %dinvalid string table offset for symbol table entry %d nameC_EFCNC_NULLC_AUTOC_EXTC_STATC_REGC_EXTDEFC_LABELC_MOSC_ARGC_STRTAGC_MOUC_UNTAGC_TPDEFC_USTATICC_ENTAGC_MOEC_REGPARMC_FIELDC_BLOCKC_FCNC_EOSC_FILEC_LINEC_HIDDENT_NULLT_CHART_SHORTT_INTT_LONGT_FLOATT_DOUBLET_STRUCTT_UNIONT_ENUMT_MOET_UCHART_USHORTT_UINTT_ULONG_SYMBOL N %-19s %c %01.*lX _SYMBOL P %-19s I %01.*lX _SYMBOL X _SYMBOL Y _SYMBOL L cannot write to output filecldlod: cldlod cldlod.c 664 146 144 42244 5151221212 5555 /* $Id: cldlod.c,v 1.20 92/02/14 15:55:24 tomc Exp $ */ #include #include #include #include #include #if defined ( __WATCOMC__ ) || defined( __DGUX__ ) || defined( macintosh ) #include #else #include #endif #if !defined ( macintosh ) #include #endif /* Headers for working with COFF files */ #include "coreaddr.h" #include "maout.h" #include "dspext.h" /* function definitions */ static void onintr(); static void cld_to_lod(); static void read_headers(); static void read_strings(); static void start_record(); static void read_sections(); static void dump_data(); #if defined ( __WATCOMC__ ) || defined( __DGUX__ ) || defined( macintosh ) static void eprintf( FILE*, char*, ... ); static void error( char*, ... ); #else static void eprintf(); static void error(); #endif /* Global variables */ FILHDR file_header; /* File header structure */ AOUTHDR opt_header; /* Optional header structure */ OPTHDR link_header; /* Linker header structure */ int absolute; /* Absolute file flag */ long num_sections; /* Number of sections */ long section_seek; /* Used to seek to first section */ long symptr; /* File pointer to symbol table entries */ long num_symbols; /* Number of symbols */ int data_width; /* width of data for printing */ int addr_width; /* width of address for printing */ char *str_tab; /* Pointer to start of string char. array */ long str_length; /* Length in bytes of string array */ FILE *ifile = NULL; /* file pointer for input file */ char *ifn = NULL; /* pointer to input file name */ /* init is to non valid memory space */ int space = 777; /* 0=p, 1=x, 2=y, 3=l, 4=N */ main (argc, argv) int argc; char *argv[]; { void exit (); /* set up for signals, save program name, check for command line options */ signal (SIGINT, onintr); /* check for correct command-line */ if ( argc != 2 ) { fprintf( stderr, "usage: cldlod cldfile > lodfile\n" ); exit ( -1 ); } if ( ( ifile = fopen( argv[1], "rb" ) ) == NULL ) error( "cannot open input file %s", argv[1] ); cld_to_lod(); fclose( ifile ); exit (0); } static void cld_to_lod() { read_headers (); read_strings (); /* blow out the _START record */ if ( symptr != 0 && num_symbols != 0 ) /* no symbols */ start_record(); read_sections (); if ( symptr != 0 && num_symbols != 0 ) /* no symbols */ dump_deb_symbols (); /* blow out the _END record */ eprintf( stdout, "\n_END %01.*X\n", addr_width, CORE_ADDR_ADDR (opt_header.entry) ); } /* blow out the first .cmt symbol with: n_sclass == C_NULL n_type == T_NULL */ static void start_record() { SYMENT se; int i = 0, sym_id = -709; if ( fseek( ifile, symptr, 0 ) != 0 ) error ("cannot seek to symbol table"); while ( i < num_symbols ) { if ( freads( (char *)&se, sizeof (SYMENT), 1, ifile ) != 1 ) error ("cannot read symbol table entry %d", i); #if !BIG_ENDIAN if ( se.n_zeroes ) swapw( se.n_name, sizeof (long), 2 ); #endif if ( strcmp( se.n_name, ".cmt" ) == 0 && se.n_sclass == C_NULL && se.n_type == T_NULL ) { sym_id = CORE_ADDR_ADDR(se.n_value); break; } i++; } /* */ eprintf( stdout, "_START " ); if ( sym_id >= 0 && str_length != 0 ) { char *str_ptr = str_tab; int len; long offset = (long) sizeof( str_length ); do { if ( offset == sym_id ) break; else { len = strlen( str_ptr ); offset += len + 1; str_ptr += len + 1; } } while ( str_ptr < ( str_tab + str_length ) ); eprintf( stdout, "%s", str_ptr ); } eprintf( stdout, "\n\n" ); } static void read_headers () { if ( freads( (char *)&file_header, sizeof (FILHDR), 1, ifile ) != 1 ) error ("cannot read file header"); /* Save the global values */ num_sections = file_header.f_nscns; num_symbols = file_header.f_nsyms; symptr = file_header.f_symptr; absolute = !!(file_header.f_flags & F_RELFLG); /* check the MAGIC number */ if ( file_header.f_magic == M56KMAGIC ) { data_width = 6; addr_width = 4; } else if ( file_header.f_magic == M96KMAGIC ) { data_width = addr_width = 8; } else if ( file_header.f_magic == M16KMAGIC ) { data_width = addr_width = 4; } else { error( "Header has a bad magic number" ); } /* optional header present */ if ( file_header.f_opthdr ) { if ( absolute ) { if ( freads( (char *)&opt_header, (int)file_header.f_opthdr, 1, ifile ) != 1 ) error( "cannot read optional file header" ); } else { if ( freads( (char *)&link_header, (int)file_header.f_opthdr, 1, ifile ) != 1 ) error( "cannot read linker file header" ); } } /* File offset for first section headers */ section_seek = sizeof(FILHDR) + file_header.f_opthdr; } static void read_strings () { long strings; strings = symptr + (num_symbols * SYMESZ); if ( fseek( ifile, strings, 0 ) != 0 ) error ( "cannot seek to string table length" ); if ( freads( (char *)&str_length, 4, 1, ifile ) != 1 && !feof( ifile )) error ( "cannot read string table length" ); if ( feof( ifile )) str_length = 0L; else if ( str_length ) { str_length -= 4; str_tab = (char *)malloc ((unsigned)str_length); if ( fseek( ifile, strings + 4, 0 ) != 0 ) error( "cannot seek to string table" ); if (fread (str_tab, (int)str_length, 1, ifile) != 1) error( "cannot read string table" ); } } static void read_sections() { int i; XCNHDR sh; /* Section header structure */ for (i = 0; i < num_sections; i++) { if (fseek (ifile, section_seek, 0) != 0) error ("cannot seek to section headers"); if (freads ((char *)&sh, sizeof (XCNHDR), 1, ifile) != 1) error ("cannot read section headers"); #if !BIG_ENDIAN if (sh._n._s_n._s_zeroes) swapw (sh._n._s_name, sizeof (long), 2); #endif section_seek += sizeof (XCNHDR); dump_data (&sh); } } char * get_secname (sh) XCNHDR *sh; { char *secname; if ( sh->_n._s_n._s_zeroes ) secname = sh->_n._s_name; else { if (sh->_n._s_n._s_offset < sizeof (str_length) || sh->_n._s_n._s_offset > str_length) error ("invalid string table offset for section header name"); secname = &str_tab[sh->_n._s_n._s_offset - sizeof (str_length)]; } return (secname); } static void dump_data (sh) XCNHDR *sh; { char *secname, *get_secname (); long *raw_data; int j; if ( sh->_s.s_scnptr && sh->_s.s_size ) { int memtype = CORE_ADDR_MAP( sh->_s.s_paddr ); int address = CORE_ADDR_ADDR( sh->_s.s_paddr ); char *mem_field; secname = get_secname( sh ); /* determine the memory field (optional counter ok) */ switch ( memtype ) { case memory_map_p: mem_field = "P"; break; case memory_map_pa: mem_field = "PA"; break; case memory_map_pb: mem_field = "PB"; break; case memory_map_pe: mem_field = "PE"; break; case memory_map_pi: mem_field = "PI"; break; case memory_map_pr: mem_field = "PR"; break; case memory_map_y: mem_field = "Y"; break; case memory_map_ya: mem_field = "YA"; break; case memory_map_yb: mem_field = "YB"; break; case memory_map_ye: mem_field = "YE"; break; case memory_map_yi: mem_field = "YI"; break; case memory_map_yr: mem_field = "YR"; break; case memory_map_x: mem_field = "X"; break; case memory_map_xa: mem_field = "XA"; break; case memory_map_xb: mem_field = "XB"; break; case memory_map_xe: mem_field = "XE"; break; case memory_map_xi: mem_field = "XI"; break; case memory_map_xr: mem_field = "XR"; break; case memory_map_l: mem_field = "L"; break; case memory_map_laa: mem_field = "LAA"; break; case memory_map_lab: mem_field = "LAB"; break; case memory_map_lba: mem_field = "LBA"; break; case memory_map_lbb: mem_field = "LBB"; break; case memory_map_le: mem_field = "LE"; break; case memory_map_li: mem_field = "LI"; break; default: mem_field = ""; break; } raw_data = (long *)malloc((unsigned)(sh->_s.s_size * sizeof (long))); if (fseek (ifile, sh->_s.s_scnptr, 0) != 0) error ("cannot seek to raw data in section %s", secname); if (freads ((char *)raw_data, (int)sh->_s.s_size, sizeof (long), ifile) != sizeof (long)) error ("cannot read raw data in section %s", secname); /* check for block data */ if ( sh->_s.s_flags & STYP_BLOCK ) { if ( mem_field[0] == 'L' ) { eprintf( stdout, "_BLOCKDATA X %01.*X %01.*X %01.*X\n", addr_width, address, addr_width, CORE_ADDR_ADDR( sh->_s.s_vaddr ), data_width, *raw_data++ ); eprintf( stdout, "_BLOCKDATA Y %01.*X %01.*X %01.*X\n", addr_width, address, addr_width, CORE_ADDR_ADDR( sh->_s.s_vaddr ), data_width, *raw_data++ ); } else { eprintf( stdout, "_BLOCKDATA %s %01.*X %01.*X %01.*X\n", mem_field, addr_width, address, addr_width, CORE_ADDR_ADDR( sh->_s.s_vaddr ), data_width, *raw_data++ ); } } else { eprintf (stdout, "_DATA %s %01.*X\n", mem_field, addr_width, address ); j = 0; while ( j < sh->_s.s_size ) { if ( mem_field[0] == 'L' ) { eprintf (stdout, "%01.*lX %01.*lX ", data_width, *(raw_data+1), data_width, *raw_data); raw_data += 2; j += 2; } else { eprintf (stdout, "%01.*lX ", data_width, *raw_data++); j++; } if ( j % 8 == 0 && j < sh->_s.s_size ) eprintf (stdout, "\n"); } eprintf (stdout, "\n"); } } } dump_deb_symbols () { SYMENT se; AUXENT ae; int i, j, k; if (fseek (ifile, symptr, 0) != 0) error ("cannot seek to symbol table"); i = 0; while (i < num_symbols) { if (freads ((char *)&se, sizeof (SYMENT), 1, ifile) != 1) error ("cannot read symbol table entry %d", i); dump_se_d (&se); /* ek */ k = i++; for (j = 0; j < se.n_numaux; j++) { if (freads ((char *)&ae, sizeof (AUXENT), 1, ifile) != 1) error ("cannot read auxiliary entry %d for symbol entry %d", j, k); i++; } } } dump_se_d (se) /* for debug symbol table */ SYMENT *se; { int old_space; char *name, *type, *sclass; char sym_type = 'I'; if (se->n_zeroes) { #if !BIG_ENDIAN swapw (se->n_name, sizeof (long), 2); #endif name = se->n_name; } else { if (se->n_offset < sizeof (str_length) || se->n_offset > str_length) error ("invalid string table offset for symbol table entry %d name", se - symptr); name = &str_tab[se->n_offset - sizeof (str_length)]; } if ( name[0] == '.' ) { return; } switch ( se->n_sclass ) { case C_EFCN: sclass = "C_EFCN"; break; case C_NULL: sclass = "C_NULL"; break; case C_AUTO: sclass = "C_AUTO"; break; case C_EXT: sclass = "C_EXT"; break; case C_STAT: sclass = "C_STAT"; break; case C_REG: sclass = "C_REG"; break; case C_EXTDEF: sclass = "C_EXTDEF"; break; case C_LABEL: sclass = "C_LABEL"; break; case C_ULABEL: sclass = "C_REG"; break; case C_MOS: sclass = "C_MOS"; break; case C_ARG: sclass = "C_ARG"; break; case C_STRTAG: sclass = "C_STRTAG"; break; case C_MOU: sclass = "C_MOU"; break; case C_UNTAG: sclass = "C_UNTAG"; break; case C_TPDEF: sclass = "C_TPDEF"; break; case C_USTATIC: sclass = "C_USTATIC"; break; case C_ENTAG: sclass = "C_ENTAG"; break; case C_MOE: sclass = "C_MOE"; break; case C_REGPARM: sclass = "C_REGPARM"; break; case C_FIELD: sclass = "C_FIELD"; break; case C_BLOCK: sclass = "C_BLOCK"; break; case C_FCN: sclass = "C_FCN"; break; case C_EOS: sclass = "C_EOS"; break; case C_FILE: sclass = "C_FILE"; break; case C_LINE: sclass = "C_LINE"; break; case C_ALIAS: sclass = "C_HIDDEN"; break; case C_HIDDEN: sclass = "C_HIDDEN"; break; default: sclass = ""; break; } switch ( BTYPE( se->n_type ) ) { case T_NULL: type = "T_NULL"; break; case T_CHAR: type = "T_CHAR"; break; case T_SHORT: type = "T_SHORT"; break; case T_INT: type = "T_INT"; break; case T_LONG: type = "T_LONG"; break; case T_FLOAT: type = "T_FLOAT"; sym_type = 'F'; break; case T_DOUBLE: type = "T_DOUBLE"; sym_type = 'F'; break; case T_STRUCT: type = "T_STRUCT"; break; case T_UNION: type = "T_UNION"; break; case T_ENUM: type = "T_ENUM"; break; case T_MOE: type = "T_MOE"; break; case T_UCHAR: type = "T_UCHAR"; break; case T_USHORT: type = "T_USHORT"; break; case T_UINT: type = "T_UINT"; break; case T_ULONG: type = "T_ULONG"; break; default: sclass = ""; break; } old_space = space; space = CORE_ADDR_MAP ( se->n_value ); switch ( space ) { case memory_map_none: if ( old_space != space ) eprintf( stdout, "_SYMBOL N\n" ); /* print symbol name and value */ eprintf (stdout, "%-19s %c %01.*lX\n", name, sym_type, data_width, CORE_ADDR_ADDR (se->n_value)); break; case memory_map_p: /* print only pointers to functions (should be ext or stat...) */ if ( ISFCN (se->n_type) ) { if ( old_space != space ) eprintf(stdout, "_SYMBOL P\n"); /* print symbol name and value */ eprintf (stdout, "%-19s I %01.*lX\n", name, data_width, CORE_ADDR_ADDR (se->n_value)); } else /* restore last written space */ space = old_space; break; case memory_map_x: if (old_space != space) eprintf (stdout, "_SYMBOL X\n"); /* print symbol name and value */ eprintf (stdout, "%-19s %c %01.*lX\n", name, sym_type, data_width, CORE_ADDR_ADDR (se->n_value)); break; case memory_map_y: if (old_space != space) eprintf (stdout, "_SYMBOL Y\n"); /* print symbol name and value */ eprintf (stdout, "%-19s %c %01.*lX\n", name, sym_type, data_width, CORE_ADDR_ADDR (se->n_value)); break; case memory_map_l: if (old_space != space) eprintf (stdout, "_SYMBOL L\n"); /* print symbol name and value */ eprintf (stdout, "%-19s %c %01.*lX\n", name, sym_type, data_width, CORE_ADDR_ADDR (se->n_value)); break; default: space = old_space; /* restore last written space */ return; break; } } /** * * name freads - swap bytes and read * * synopsis freads (ptr, size, nitems, stream) * char *ptr; pointer to buffer * int size; size of buffer * int nitems; number of items to read * FILE *stream; file pointer * * description Treats ptr as reference to union array; if necessary, * swaps bytes to maintain base format byte ordering * (big endian). Calls fread to do I/O. * **/ freads (ptr, size, nitems, stream) char *ptr; int size, nitems; FILE *stream; { int rc; rc = fread (ptr, size, nitems, stream); #if !BIG_ENDIAN swapw (ptr, size, nitems); #endif return (rc); } #if !BIG_ENDIAN union wrd { /* word union for byte swapping */ unsigned long l; unsigned char b[4]; }; /** * * name swapw - swap bytes in words * * synopsis swapw (ptr, size, nitems) * char *ptr; pointer to buffer * int size; size of buffer * int nitems; number of items to write * * description Treats ptr as reference to union array; if necessary, * swaps bytes to maintain base format byte ordering * (big endian). * **/ swapw (ptr, size, nitems) char *ptr; int size, nitems; { union wrd *w; union wrd *end = (union wrd *)ptr + ((size * nitems) / sizeof (union wrd)); unsigned i; for (w = (union wrd *)ptr; w < end; w++) { i = w->b[0]; w->b[0] = w->b[3]; w->b[3] = i; i = w->b[1]; w->b[1] = w->b[2]; w->b[2] = i; } } #endif static void onintr () /* clean up from signal */ { void exit (); exit (1); } #ifdef va_dcl #undef va_dcl #define va_dcl char *va_alist; #endif /* VARARGS */ /* call fprintf, check for errors */ static void #if defined ( __WATCOMC__ ) || defined( __DGUX__ ) || defined( macintosh ) eprintf (FILE *fp, char *fmt, ...) #else eprintf( va_alist ) va_dcl #endif { void exit (); va_list ap; #if defined ( __WATCOMC__ ) || defined( __DGUX__ ) || defined( macintosh ) va_start (ap, fmt); #else FILE *fp; char *fmt; va_start (ap); fp = va_arg (ap, FILE *); fmt = va_arg (ap, char *); #endif if (vfprintf (fp, fmt, ap) < 0) error ("cannot write to output file"); va_end (ap); } /* VARARGS */ static void #if defined ( __WATCOMC__ ) || defined( __DGUX__ ) || defined( macintosh ) error (char *fmt, ...) /* display error on stderr, exit nonzero */ #else error (va_alist) /* display error on stderr, exit nonzero */ va_dcl #endif { void exit (); va_list ap; #if !LINT int err = errno; #endif #if defined ( __WATCOMC__ ) || defined( __DGUX__ ) || defined( macintosh ) va_start (ap, fmt); #else char *fmt; va_start (ap); fmt = va_arg (ap, char *); #endif fprintf (stderr, "cldlod: "); vfprintf (stderr, fmt, ap); fprintf (stderr, "\n"); va_end (ap); #if !LINT if (err) { errno = err; perror ( "cldlod" ); } #endif exit (1); } DDR_ADDR( sh->_s.s_vaddr ), data_width, *raw_data++ ); } } else { eprintf (stdout, "_DATA %s %01.*X\n", mem_field, addr_width, address ); j = 0; while ( j < sh->_s.s_size ) { if ( mem_field[0] == 'L' ) { eprintf (stdout, "%01.*lX %01.*lX ", data_width, *(raw_data+1), data_widmakefile 664 146 144 3165 5151221264 5636 # $Id: makefile,v 1.8 92/01/14 15:44:48 jay Exp $ #CC = gcc # GNU compiler CC = cc # NeXT,DEC OS = -DBSD # Sun, DEC, Apollo #OS = # Non-BSD (PC, Mac) #OS = -DMACH # Mach (NeXT) #ARCH = -DM68020=1 # Sun 3, NeXT, Apollo, HP, Mac #ARCH = -DSPARC=1 # Sun 4 #ARCH = -DI8086=1 # PC ARCH = -DD3100=1 # DEC 3100 #ENDIAN = -DBIG_ENDIAN=1 # everything but DEC and PC ENDIAN = -DBIG_ENDIAN=0 # DEC3100 and PC INSTALL = /bin/mv INSTALLDIR = # #CLASDIR=clas56 #CLASDIR=clas96 CLASDIR=clas16 #ARCDIR=sun3 #ARCDIR=sun4 #ARCDIR=next #ARCDIR=apl ARCDIR=dec DISTDIR=../../dist/$(ARCDIR)/$(CLASDIR) DBIN=$(DISTDIR)/bin DTOOL=$(DISTDIR)/cldtools DISTSRC=cldinfo.c cldlod.c cofdmp.c srec.c strip.c tiohist.c cofdmp.h srec.h strip.h makefile DISTBIN=cldinfo cldlod cofdmp srec strip tiohist all: cldinfo cldlod srec cofdmp strip tiohist dist: test -d ../../dist || mkdir ../../dist test -d ../../dist/$(ARCDIR) || mkdir ../../dist/$(ARCDIR) test -d $(DISTDIR) || mkdir $(DISTDIR) test -d $(DBIN) || mkdir $(DBIN) test -d $(DTOOL) || mkdir $(DTOOL) for i in ${DISTBIN} ; do cp $$i $(DBIN)/. ; done for i in ${DISTSRC} ; do cp $$i $(DTOOL)/. ; done clean: rm *.o cldinfo cldlod srec cofdmp strip tiohist cldlod: $(CC) -O $(ENDIAN) -I../mcoffinc cldlod.c -o cldlod cldinfo: $(CC) -O $(ENDIAN) -I../mcoffinc cldinfo.c -o cldinfo srec: $(CC) -O $(OS) $(ARCH) -I../mcoffinc srec.c -o srec cofdmp: $(CC) -O $(OS) $(ARCH) -I../mcoffinc cofdmp.c -o cofdmp strip: $(CC) -O $(OS) $(ARCH) -I../mcoffinc strip.c -o strip tiohist: $(CC) -O $(OS) $(ARCH) tiohist.c -o tiohist install: $(INSTALL) cldinfo cldlod srec cofdmp strip tiohist $(INSTALLDIR)r, exit nonzero */ #else error (va_alist) /* display error on stderr, exit nonzero */ va_dcl #endif { void exit (); va_list ap; #if !LINT int err = errno; #endif #if defined ( __WATCOMC__ ) || defined( __DGUX__ ) || defined( macintosh ) va_start (ap, fmt); #else char *fmt; va_start (ap); fmt = va_arg (ap, char *); #endif fprintf (stderr, "cldlod: "); vfprle length" ); if ( freads( (char *)&str_length, 4, 1, ifile ) != 1 && !feof( ifile )) error ( "cannot read string table length" ); if ( feof( ifile )) str_length = 0L; else if ( str_length ) { str_length -= 4; str_tab = (char *)malloc ((unsigned)str_length); if ( fseek( ifile, strings + 4, 0 ) != 0 ) error( "cannot seek to string table" ); if (fread (str_tab, (int)str_length, 1, ifile) != 1) error( "cannot read string table" ); } } static void read_sections() { int i; XCNHDR sh; /* Section header structure */ for (i = 0; i < num_sections; i++) { if (fseek (ifile, section_seek, 0) != 0) error ("cannot seek to section headers"); if (freads ((char *)&sh, sizeof (XCNHDR), 1, ifile) != 1) error ("cannot read section headers"); #if !BIG_ENDIAN if (sh._n._s_n._s_zeroes) swapw (sh._n._s_name, sizeof (long), 2); #endif section_seek += sizeof (XCNHDR); dump_data (&sh); } } char * get_secname (sh) XCNHDR *sh; { char *secname; if ( sh->_n._s_n._s_zeroes ) secname = sh->_n._s_name; else { if (sh->_n._s_n._s_offset < sizeof (str_length) || sh->_n._s_n._s_offset > str_length) error ("invalid string table offset for section header name"); secname = &str_tab[sh->_n._s_n._s_offset - sizeof (str_length)]; } return (secname); } static void dump_data (sh) XCNHDR *sh; { char *secname, *get_secname (); long *raw_data; int j; if ( sh->_s.s_scnptr && sh->_s.s_size ) { int memtype = CORE_ADDR_MAP( sh->_s.s_paddr ); int address = CORE_ADDR_ADDR( sh->_s.s_paddr ); char *mem_field; secname = get_secname( sh ); /* determine the memory field (optional counter ok) */ switch ( memtype ) { case memory_map_p: mem_field = "P"; break; case memory_map_pa: mem_field = "PA"; break; case memory_map_pb: mem_field = "PB"; break; case memory_map_pe: mem_field = "PE"; break; case memory_map_pi: mem_field = "PI"; break;