|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T o
Length: 4110 (0x100e) Types: TextFile Names: »objfile.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit └─⟦3f75c1919⟧ »EurOpenD3/utils/decomp.tar.Z« └─⟦510c4d5ee⟧ └─⟦this⟧ »decomp/objfile.c«
/* * Module: objfile.c * * Author: J. Reuter * * This module contains code that reads the various parts of object * and a.out symbol tables. These "parts" include the symbol table * proper, the "string" table that contains the symbol names, and * the relocation table, if it exists. */ #include "defs.h" #include "main.h" #include <sys/types.h> #include <sys/stat.h> char *strtab; struct nlist *symtab; int nsym; struct relocation_info *rel; int nrel; char *datatab; int ndata; int datoff; sym_read() { struct stat statbuf; int stab_size; /* read the string table */ fseek( objfile, N_STROFF( obj_header ), 0 ); fstat( fileno( objfile ), &statbuf ); stab_size = statbuf.st_size - N_STROFF( obj_header ); strtab = (char *)malloc( stab_size ); if ( strtab == NULL ) { fprintf( stderr, "Out of memory\n" ); exit( 1 ); } fread( strtab, 1, stab_size, objfile ); /* read the symbol table proper */ fseek( objfile, N_SYMOFF( obj_header ), 0 ); nsym = obj_header.a_syms; symtab = (struct nlist *) malloc( nsym ); if ( symtab == NULL ) { fprintf( stderr, "Out of memory\n" ); exit( 1 ); } fread( symtab, 1, nsym, objfile ); /* read the relocaion table */ fseek( objfile, N_TRLOFF( obj_header ), 0 ); nrel = obj_header.a_trsize + obj_header.a_drsize; rel = (struct relocation_info *) malloc( nrel ); if ( rel == NULL ) { fprintf( stderr, "Out of memory\n" ); exit( 1 ); } fread( rel, 1, nrel, objfile ); /* read initialized data */ datoff = N_DATOFF( obj_header ); fseek( objfile, datoff, 0 ); ndata = N_TRLOFF( obj_header) - datoff; datatab = malloc( ndata ); if ( datatab == NULL ) { fprintf( stderr, "Out of memory\n" ); exit( 1 ); } fread( datatab, 1, ndata, objfile ); datoff -= N_TXTOFF( obj_header ); /* offset by header size */ } struct relocation_info *relo_cur; relo_first() { relo_cur = rel; } struct relocation_info * relo_next() { if ( relo_cur - rel >= nrel ) return NULL; else return relo_cur++; } sym_find( addr ) address addr; { int i; for ( i=0; i < nsym/sizeof(struct nlist); i++ ) if ( (symtab+i)->n_value == addr ) return i; return -1; } char * prname( name ) char *name; { if ( name[0] == '_' ) return name + 1; else return name; } #ifdef debug symdump() { register int i; register struct nlist *s; printf( "Name Type Other Desc Value\n" ); for ( i=0; i<nsym/sizeof(struct nlist); i++ ) { s = symtab+i; printf( "%-15s %3d %4d %6x %8d\n", &strtab[s->n_un.n_strx], s->n_type, s->n_other, s->n_desc, s->n_value ); } } reldump( start, count ) int start; int count; { int i; struct nlist *s; start /= sizeof( struct relocation_info ); count /= sizeof( struct relocation_info ); printf( " Address Pcrel Length Extrn Stype Sval Sname\n" ); for ( i=start; i < count+start; i++ ) { s = &symtab[(rel+i)->r_symbolnum]; printf( "%8d %5d %6d %3d %3d %6d %-30s\n", (rel+i)->r_address, (rel+i)->r_pcrel, (rel+i)->r_length, (rel+i)->r_extern, s->n_type, s->n_value, &strtab[s->n_un.n_strx] ); } } #endif debug /* * The following routines allow reading of the code section of the * object file. */ static long current_pos = 0; char get_byte( addr ) address addr; { char byte; if ( addr != current_pos ) { fseek( objfile, offset + addr, 0 ); current_pos = addr; } fread( &byte, sizeof(byte), 1, objfile ); current_pos += 1; return byte; } short get_word( addr ) address addr; { short word; if ( addr != current_pos ) { fseek( objfile, offset + addr, 0 ); current_pos = addr; } fread( &word, sizeof(word), 1, objfile ); current_pos += 2; return word; } long get_long( addr ) address addr; { long longword; if ( addr != current_pos ) { fseek( objfile, offset + addr, 0 ); current_pos = addr; } fread( &longword, sizeof(longword), 1, objfile ); current_pos += 4; return longword; }