static void registerSegment( orl_sec_handle o_shnd ) //************************************************** { orl_sec_flags sec_flags; orl_sec_handle reloc_section; orl_sec_alignment alignment; char * content; int ctr; segment *seg; seg = NewSegment(); seg->name = ORLSecGetName( o_shnd ); seg->size = ORLSecGetSize( o_shnd ); seg->start = 0; seg->use_32 = 1; // only 32-bit object files use ORL seg->attr = ( 2 << 2 ); // (?) combine public alignment = ORLSecGetAlignment( o_shnd ); // FIXME: Need better alignment translation. switch( alignment ) { case 0: seg->attr |= ( 1 << 5 ); break; case 1: seg->attr |= ( 2 << 5 ); break; case 3: case 4: seg->attr |= ( 3 << 5 ); break; case 8: seg->attr |= ( 4 << 5 ); break; case 2: seg->attr |= ( 5 << 5 ); break; case 12: seg->attr |= ( 6 << 5 ); break; default: // fprintf( stderr, "NOTE! 'Strange' alignment (%d) found. Using byte alignment.\n", alignment ); seg->attr |= ( 1 << 5 ); break; } sec_flags = ORLSecGetFlags( o_shnd ); if( !( sec_flags & ORL_SEC_FLAG_EXEC ) ) { seg->data_seg = true; } if( seg->size > 0 && ORLSecGetContents( o_shnd, &content ) == ORL_OKAY ) { Segment = seg; // Putting contents into segment struct. for( ctr = 0; ctr < seg->size; ctr++ ) { PutSegByte( ctr, content[ctr] ); } } if( !HashTableInsert( SectionToSegmentTable, (hash_value)o_shnd, (hash_data)seg ) ) { SysError( ERR_OUT_OF_MEM, false ); } reloc_section = ORLSecGetRelocTable( o_shnd ); if( reloc_section ) { if( !addRelocSection( reloc_section ) ) { SysError( ERR_OUT_OF_MEM, false ); } } }
static return_val textOrDataSectionInit( orl_sec_handle shnd ) { return_val error; orl_sec_handle reloc_sec; error = createLabelList( shnd ); if( error == RC_OKAY ) { error = createRefList( shnd ); if( error == RC_OKAY ) { reloc_sec = ORLSecGetRelocTable( shnd ); if( reloc_sec != ORL_NULL_HANDLE ) { error = addRelocSection( reloc_sec ); } } } return( error ); }