extern void ObjRelocsFini( void ) { //********************************* // After all lines have been parsed, we need to check whether there're any // unmatched relocs still hanging around. If there're unmatched h^relocs, // we issue an error. If there're unmatched l^relocs, we should be able // to emit them. sym_reloc reloc; sym_handle sym; int_32 numlabel_ref; reloc = SymGetReloc( TRUE, &sym ); while( reloc != NULL ) { if( reloc->named ) { Error( UNMATCHED_HIGH_RELOC, SymName( sym ) ); } else { Error( UNMATCHED_HIGH_RELOC, "<numeric reference>" ); } SymDestroyReloc( sym, reloc ); reloc = SymGetReloc( TRUE, &sym ); } reloc = SymGetReloc( FALSE, &sym ); while( reloc != NULL ) { if( reloc->named ) { doEmitReloc( reloc->location.offset, SymName( sym ), OWL_RELOC_HALF_LO, TRUE ); } else { numlabel_ref = AsNumLabelGetNum( SymName( sym ) ); doEmitReloc( reloc->location.offset, &numlabel_ref, OWL_RELOC_HALF_LO, FALSE ); } SymDestroyReloc( sym, reloc ); reloc = SymGetReloc( FALSE, &sym ); } #ifdef AS_DEBUG_DUMP (void)SymRelocIsClean( TRUE ); #endif AsNumLabelFini(); // resolve all numeric label relocs resolveRelativeRelocs(); }
void OWLENTRY OWLFileFini( owl_file_handle file ) { //************************************************* owl_section_handle curr; owl_section_handle next; resolveRelativeRelocs( file ); resolveLabelNames( file ); resolveComdefSymbols( file ); if( file->format == OWL_FORMAT_COFF ) { COFFFileEmit( file ); } else { ELFFileEmit( file ); } for( curr = file->sections; curr != NULL; curr = next ) { next = curr->next; OWLSectionFree( curr ); } OWLSymbolTableFini( file->symbol_table ); OWLStringFini( file->string_table ); deleteFile( file->info, file ); _ClientFree( file, file ); }