MCPcopy Create free account
hub / github.com/beefytech/Beef / Finish

Method Finish

IDEHelper/Backend/BeCOFFObject.cpp:2212–2441  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2210}
2211
2212void 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(&sectHdr, 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

Callers

nothing calls this directly

Calls 13

sizeMethod · 0.45
resizeMethod · 0.45
c_strMethod · 0.45
GetSizeMethod · 0.45
emptyMethod · 0.45
WriteTMethod · 0.45
GetPosMethod · 0.45
WriteMethod · 0.45
GetPtrMethod · 0.45
reserveMethod · 0.45
lengthMethod · 0.45
push_backMethod · 0.45

Tested by

no test coverage detected