| 2210 | } |
| 2211 | |
| 2212 | void BeCOFFObject::Finish() |
| 2213 | { |
| 2214 | BP_ZONE("BeCOFFObject::Finish"); |
| 2215 | //AutoPerf perf("BeCOFFObject::Finish", mPerfManager); |
| 2216 | |
| 2217 | PEFileHeader header; |
| 2218 | memset(&header, 0, sizeof(header)); |
| 2219 | header.mMachine = PE_MACHINE_X64; |
| 2220 | header.mTimeDateStamp = mTimestamp; |
| 2221 | |
| 2222 | header.mNumberOfSections = (int)mUsedSections.size(); |
| 2223 | SizedArray<PESectionHeader, 16> sectHdrs; |
| 2224 | sectHdrs.resize(header.mNumberOfSections); |
| 2225 | SizedArray<BeCOFFSection*, 16> sectData; |
| 2226 | sectData.resize(header.mNumberOfSections); |
| 2227 | int filePos = sizeof(PEFileHeader) + header.mNumberOfSections*sizeof(PESectionHeader); |
| 2228 | |
| 2229 | for (int sectNum = 0; sectNum < header.mNumberOfSections; sectNum++) |
| 2230 | { |
| 2231 | PESectionHeader& sectHdr = sectHdrs[sectNum]; |
| 2232 | memset(§Hdr, 0, sizeof(sectHdr)); |
| 2233 | BeCOFFSection* sect = mUsedSections[sectNum]; |
| 2234 | strcpy(sectHdr.mName, sect->mSectName.c_str()); |
| 2235 | |
| 2236 | int characteristics = sect->mCharacteristics; |
| 2237 | if (sect->mAlign != 0) |
| 2238 | { |
| 2239 | if (sect->mAlign == 8192) characteristics |= IMAGE_SCN_ALIGN_8192BYTES; |
| 2240 | else if (sect->mAlign == 4096) characteristics |= IMAGE_SCN_ALIGN_4096BYTES; |
| 2241 | else if (sect->mAlign == 2048) characteristics |= IMAGE_SCN_ALIGN_2048BYTES; |
| 2242 | else if (sect->mAlign == 1024) characteristics |= IMAGE_SCN_ALIGN_1024BYTES; |
| 2243 | else if (sect->mAlign == 512) characteristics |= IMAGE_SCN_ALIGN_512BYTES; |
| 2244 | else if (sect->mAlign == 256) characteristics |= IMAGE_SCN_ALIGN_256BYTES; |
| 2245 | else if (sect->mAlign == 128) characteristics |= IMAGE_SCN_ALIGN_128BYTES; |
| 2246 | else if (sect->mAlign == 64) characteristics |= IMAGE_SCN_ALIGN_64BYTES; |
| 2247 | else if (sect->mAlign == 32) characteristics |= IMAGE_SCN_ALIGN_32BYTES; |
| 2248 | else if (sect->mAlign == 16) characteristics |= IMAGE_SCN_ALIGN_16BYTES; |
| 2249 | else if (sect->mAlign == 8) characteristics |= IMAGE_SCN_ALIGN_8BYTES; |
| 2250 | else if (sect->mAlign == 4) characteristics |= IMAGE_SCN_ALIGN_4BYTES; |
| 2251 | else if (sect->mAlign == 2) characteristics |= IMAGE_SCN_ALIGN_2BYTES; |
| 2252 | } |
| 2253 | |
| 2254 | sectData[sectNum] = sect; |
| 2255 | int dataSize = sect->mData.GetSize(); |
| 2256 | if (dataSize != 0) |
| 2257 | { |
| 2258 | sectHdr.mPointerToRawData = filePos; |
| 2259 | sectHdr.mSizeOfRawData = dataSize; |
| 2260 | filePos += dataSize; |
| 2261 | |
| 2262 | if (!sect->mRelocs.empty()) |
| 2263 | { |
| 2264 | sectHdr.mPointerToRelocations = filePos; |
| 2265 | if (sect->mRelocs.size() > 0xFFFF) |
| 2266 | { |
| 2267 | characteristics |= IMAGE_SCN_LNK_NRELOC_OVFL; |
| 2268 | |
| 2269 | // Extended reloc count |
nothing calls this directly
no test coverage detected