static void resolveRelativeRelocs( owl_file_handle file ) { //********************************************************* owl_section_handle curr; owl_reloc_info *reloc; owl_reloc_info **last; owl_symbol_info *symbol; for( curr = file->sections; curr != NULL; curr = curr->next ) { if( curr->num_relocs == 0 ) continue; last = &curr->first_reloc; reloc = curr->first_reloc; while( reloc != NULL ) { curr->last_reloc = reloc; symbol = reloc->symbol; if( symbol->section == curr && OWLRelocIsRelative( file, reloc ) ) { // so we have a relocation to a reloc which is in this section *last = reloc->next; doReloc( curr, reloc ); reloc = *last; } else { symbol->num_relocs += 1; last = &reloc->next; reloc = reloc->next; } } } }
static void resolveRelativeRelocs( void ) { //***************************************** // Do all relative relocs within the inline code and // complain about references that are not internal and not defined by the // compiler. asmreloc *curr_reloc; asmreloc **last; char *keep_name; enum sym_state state; curr_reloc = AsmRelocs; last = &AsmRelocs; while( curr_reloc ) { if( SymLocationKnown( SymLookup( curr_reloc->name ) ) ) { if( IS_RELOC_RELATIVE( curr_reloc->type ) ) { doReloc( curr_reloc ); } else { // If not relative, we won't do it! (?) Error( ABS_REF_NOT_ALLOWED, curr_reloc->name ); } } else { // See if it's defined outside. state = AsmQueryState( AsmQuerySymbol( curr_reloc->name ) ); if( state == SYM_UNDEFINED ) { Error( SYMBOL_NOT_DECLARED, curr_reloc->name ); } else { if( IS_RELOC_RELATIVE( curr_reloc->type ) && state == SYM_STACK ) { Error( CANNOT_JUMP_TO_STACKVAR ); } else { // Leave these in the list... //Warning( "'%s' is left for CC to take care of", curr_reloc->name ); keep_name = MemAlloc( strlen( curr_reloc->name ) + 1 ); strcpy( keep_name, curr_reloc->name ); curr_reloc->name = keep_name; last = &curr_reloc->next; curr_reloc = curr_reloc->next; continue; } } } *last = curr_reloc->next; MemFree( curr_reloc ); curr_reloc = *last; } }