Author: bonefish Date: 2009-12-01 10:55:33 +0100 (Tue, 01 Dec 2009) New Revision: 34405 Changeset: http://dev.haiku-os.org/changeset/34405/haiku Modified: haiku/trunk/src/kits/storage/ResourceFile.cpp Log: Don't read() the individual program and section headers, but rather read() the respective tables at once. Modified: haiku/trunk/src/kits/storage/ResourceFile.cpp =================================================================== --- haiku/trunk/src/kits/storage/ResourceFile.cpp 2009-12-01 09:47:27 UTC (rev 34404) +++ haiku/trunk/src/kits/storage/ResourceFile.cpp 2009-12-01 09:55:33 UTC (rev 34405) @@ -538,12 +538,21 @@ resourceOffset = std::max(resourceOffset, programHeaderTableOffset + programHeaderTableSize); + // load the program headers into memory + uint8* programHeaders = (uint8*)malloc( + programHeaderCount * programHeaderSize); + if (programHeaders == NULL) + throw Exception(B_NO_MEMORY); + MemoryDeleter programHeadersDeleter(programHeaders); + + read_exactly(file, programHeaderTableOffset, programHeaders, + programHeaderCount * programHeaderSize, + "Failed to read ELF program headers."); + // iterate through the program headers for (uint32 i = 0; i < programHeaderCount; i++) { - uint64 shOffset = programHeaderTableOffset + i * programHeaderSize; - ElfProgramHeader programHeader; - read_exactly(file, shOffset, &programHeader, - sizeof(ElfProgramHeader), "Failed to read ELF program header."); + ElfProgramHeader& programHeader + = *(ElfProgramHeader*)(programHeaders + i * programHeaderSize); // get the header values uint32 type = _GetInt(programHeader.p_type); @@ -587,12 +596,21 @@ resourceOffset = std::max(resourceOffset, sectionHeaderTableOffset + sectionHeaderTableSize); + // load the section headers into memory + uint8* sectionHeaders = (uint8*)malloc( + sectionHeaderCount * sectionHeaderSize); + if (sectionHeaders == NULL) + throw Exception(B_NO_MEMORY); + MemoryDeleter sectionHeadersDeleter(sectionHeaders); + + read_exactly(file, sectionHeaderTableOffset, sectionHeaders, + sectionHeaderCount * sectionHeaderSize, + "Failed to read ELF section headers."); + // iterate through the section headers for (uint32 i = 0; i < sectionHeaderCount; i++) { - uint32 shOffset = sectionHeaderTableOffset + i * sectionHeaderSize; - ElfSectionHeader sectionHeader; - read_exactly(file, shOffset, §ionHeader, - sizeof(ElfSectionHeader), "Failed to read ELF section header."); + ElfSectionHeader& sectionHeader + = *(ElfSectionHeader*)(sectionHeaders + i * sectionHeaderSize); // get the header values uint32 type = _GetInt(sectionHeader.sh_type);