MCPcopy Create free account
hub / github.com/Inori/GPCS4 / mapImageIntoMemory

Method mapImageIntoMemory

GPCS4/Loader/ELFMapper.cpp:230–288  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

228}
229
230bool ELFMapper::mapImageIntoMemory()
231{
232 bool retVal = false;
233 MODULE_INFO &info = m_moduleData->m_moduleInfo;
234
235 do
236 {
237 size_t totalSize = calculateTotalLoadableSize();
238 if (totalSize == 0)
239 {
240 break;
241 }
242
243 uint8_t* buffer = reinterpret_cast<uint8_t*>(plat::VMAllocateAlign(
244 nullptr,
245 totalSize, plat::VM_PAGE_SIZE,
246 plat::VMAT_RESERVE_COMMIT, plat::VMPF_CPU_RWX));
247
248 if (buffer == nullptr)
249 {
250 break;
251 }
252
253 m_moduleData->m_mappedMemory.reset(buffer);
254 m_moduleData->m_mappedSize = totalSize;
255
256 LOG_DEBUG("Module %s loaded. start %p end %p size=%ld",
257 m_moduleData->fileName.c_str(), buffer, buffer + totalSize, totalSize);
258
259 info.pMappedAddr = buffer;
260 info.nMappedSize = totalSize;
261
262 for (auto const &phdr : m_moduleData->m_segmentHeaders)
263 {
264 if (phdr.p_flags & PF_X)
265 {
266 retVal = mapCodeSegment(phdr);
267 LOG_DEBUG("code segment at 0x%x size=%ld", info.pCodeAddr,
268 info.nCodeSize);
269 }
270 else if (phdr.p_type == PT_SCE_RELRO)
271 {
272 retVal = mapSecReloSegment(phdr);
273 }
274 else if (phdr.p_flags & PF_W)
275 {
276 retVal = mapDataSegment(phdr);
277 LOG_DEBUG("data segment at 0x%x size=%ld", info.pDataAddr,
278 info.nDataSize);
279 // there should no longer be segment to be mapped,
280 // and we stop enumerating right here.
281 break;
282 }
283 }
284
285 } while (false);
286
287 return retVal;

Callers 1

loadModuleFromFileMethod · 0.80

Calls 3

VMAllocateAlignFunction · 0.85
resetMethod · 0.45
c_strMethod · 0.45

Tested by

no test coverage detected