Example #1
0
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;
            }
        }
    }
}
Example #2
0
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;
    }
}