예제 #1
0
static void WriteELFGroups( ElfHdr *hdr )
/***************************************/
{
    group_entry *group;
    Elf32_Shdr *sh;
    Elf32_Phdr *ph;
    offset      off;
    offset      linear;

    sh = hdr->sh + hdr->i.grpbase;
    ph = hdr->ph + 1;
    off = hdr->curr_off;
    for( group = Groups; group != NULL; group = group->next_group ) {
        if( group->totalsize == 0 ) continue;   // DANGER DANGER DANGER <--!!!
        SetGroupHeaders( group, off, ph, sh );
        WriteGroupLoad( group );
        off = OffsetAlign( off + group->size, FmtData.objalign );
        AddSecName( hdr, sh, GroupSecName(group) );
        sh++;
        if( group == DataGroup && FmtData.dgroupsplitseg != NULL ) {
            AddSecName( hdr, sh, ".bss" );
            linear = ph->p_vaddr + ROUND_UP( ph->p_filesz, FmtData.objalign );
            InitBSSSect( sh, off, CalcSplitSize(), linear );
            linear = ROUND_UP( linear + sh->sh_size, FmtData.objalign);
            sh++;
            if( StackSegPtr != NULL ) {
                AddSecName( hdr, sh, ".stack" );
                InitBSSSect( sh, off, StackSize, linear );
                sh++;
            }
        }
        ph++;
    }
    hdr->curr_off = off;
}
예제 #2
0
static void WriteOS2Data( unsigned_32 stub_len, os2_exe_header *exe_head )
/************************************************************************/
/* copy code from extra memory to loadfile. */
{
    group_entry         *group;
    unsigned            group_num;
    unsigned long       off;
    segment_record      segrec;
    unsigned_32         seg_addr;
    unsigned long       relocsize;

    DEBUG(( DBG_BASE, "Writing data" ));

    group_num = 0;
    for( group = Groups; group != NULL; group = group->next_group ) {
        if( group->totalsize == 0 ) continue;   // DANGER DANGER DANGER <--!!!
        segrec.info = group->segflags;
        // write segment
        segrec.min = MAKE_EVEN( group->totalsize );
        segrec.size = MAKE_EVEN( group->size );
        if( segrec.size != 0 ) {
            off = NullAlign( 1 << FmtData.u.os2.segment_shift );
            seg_addr = off >> FmtData.u.os2.segment_shift;
            if( seg_addr > 0xffff ) {
                LnkMsg( ERR+MSG_ALIGN_TOO_SMALL, NULL );
            };
            segrec.address = (unsigned_16)seg_addr;
            WriteGroupLoad( group );
            NullAlign( 2 );         // segment must be even length
            relocsize = WriteOS2Relocs( group );
            if( relocsize != 0 ) {
                segrec.info |= SEG_RELOC;
            }

        } else {