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; }
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 {