void ResetPermData( void ) /******************************/ { IncFileName = NULL; IncStrTab = NULL; ReadRelocs = NULL; OldExe = NULL; AltDefData = NULL; OldSymFile = NULL; IncGroupDefs = NULL; IncGroups = NULL; SavedUserLibs = NULL; SavedDefLibs = NULL; CarveClass = CarveCreate( sizeof(class_entry), 20 * sizeof(class_entry) ); CarveGroup = CarveCreate( sizeof(group_entry), 20 * sizeof(group_entry) ); CarveDLLInfo = CarveCreate( sizeof(dll_sym_info), 100*sizeof(dll_sym_info)); CarveExportInfo = CarveCreate(sizeof(entry_export),20*sizeof(entry_export)); CarveLeader = CarveCreate( sizeof(seg_leader), SEG_CARVE_SIZE ); CarveModEntry = CarveCreate( sizeof(mod_entry), MOD_CARVE_SIZE ); CarveSegData = CarveCreate( sizeof(segdata), SDATA_CARVE_SIZE ); CarveSymbol = CarveCreate( sizeof(symbol), SYM_CARVE_SIZE ); InitStringTable( &PermStrings, TRUE ); InitStringTable( &PrefixStrings, TRUE ); InitStringTable( &StoredRelocs, FALSE ); }
void ChkElfData( void ) /****************************/ { group_entry *group; symbol * sym; NumExports = NumImports = 0; for( sym = HeadSym; sym != NULL; sym = sym->link ) { if( IsSymElfImported(sym) ) { NumImports++; } else if( IsSymElfExported(sym) ) { if( !(sym->info & SYM_DEFINED) ) { LnkMsg( ERR+MSG_EXP_SYM_NOT_FOUND, "s", sym->name ); } NumExports++; } } InitStringTable( &SymStrTab, FALSE ); AddCharStringTable( &SymStrTab, '\0' ); ElfSymTab = CreateElfSymTable( NumImports + NumExports + NumGroups, &SymStrTab); for( group = Groups; group != NULL; group = group->next_group ) { if( group->totalsize != 0 ) { AddSymElfSymTable( ElfSymTab, group->sym ); } } for( sym = HeadSym; sym != NULL; sym = sym->link ) { if( IsSymElfImpExp(sym) ) { AddSymElfSymTable(ElfSymTab, sym); } } }
bool C4Language::LoadLanguage(const char *strLanguages) { // Clear old string table ClearLanguage(); // Try to load string table according to language sequence char strLanguageCode[2 + 1]; for (int i = 0; SCopySegment(strLanguages, i, strLanguageCode, ',', 2, true); i++) if (InitStringTable(strLanguageCode)) return true; // No matching string table found: hardcoded fallback to US if (InitStringTable("US")) return true; // No string table present: this is really bad Log("Error loading language string table."); return false; }
static void SetHeaders( ElfHdr *hdr ) /***********************************/ { memcpy( hdr->eh.e_ident, ELF_SIGNATURE, ELF_SIGNATURE_LEN ); hdr->eh.e_ident[EI_CLASS] = ELFCLASS32; #ifdef __BIG_ENDIAN__ hdr->eh.e_ident[EI_DATA] = ELFDATA2MSB; #else hdr->eh.e_ident[EI_DATA] = ELFDATA2LSB; #endif hdr->eh.e_ident[EI_VERSION] = EV_CURRENT; hdr->eh.e_ident[EI_OSABI] = FmtData.u.elf.abitype; hdr->eh.e_ident[EI_ABIVERSION] = FmtData.u.elf.abiversion; memset( &hdr->eh.e_ident[EI_PAD], 0, EI_NIDENT - EI_PAD ); hdr->eh.e_type = ET_EXEC; if( LinkState & HAVE_PPC_CODE ) { hdr->eh.e_machine = EM_PPC; } else if( LinkState & HAVE_MIPS_CODE ) { hdr->eh.e_machine = EM_MIPS; } else if( LinkState & HAVE_X64_CODE ) { hdr->eh.e_machine = EM_X86_64; } else { hdr->eh.e_machine = EM_386; } hdr->eh.e_version = EV_CURRENT; if( StartInfo.type == START_UNDEFED ) { hdr->eh.e_entry = 0; } else { hdr->eh.e_entry = FindLinearAddr2( &StartInfo.addr ); } hdr->eh.e_flags = 0; hdr->eh.e_ehsize = sizeof(Elf32_Ehdr); hdr->eh.e_phentsize = sizeof(Elf32_Phdr); hdr->eh.e_shentsize = sizeof(Elf32_Shdr); hdr->eh.e_phnum = NumGroups + 1; hdr->eh.e_phoff = sizeof(Elf32_Ehdr); hdr->ph_size = sizeof(Elf32_Phdr) * hdr->eh.e_phnum; _ChkAlloc( hdr->ph, hdr->ph_size ); hdr->ph->p_type = PT_PHDR; hdr->ph->p_offset = sizeof(Elf32_Ehdr); hdr->ph->p_vaddr = sizeof(Elf32_Ehdr) + FmtData.base; hdr->ph->p_paddr = 0; hdr->ph->p_filesz = hdr->ph_size; hdr->ph->p_memsz = hdr->ph_size; hdr->ph->p_flags = PF_R | PF_X; hdr->ph->p_align = 0; InitStringTable( &hdr->secstrtab, FALSE ); AddCharStringTable( &hdr->secstrtab, '\0' ); InitSections( hdr ); hdr->curr_off = hdr->eh.e_ehsize + hdr->ph_size; hdr->curr_off = ROUND_UP( hdr->curr_off, 0x100 ); SeekLoad( hdr->curr_off ); }