| 228 | } |
| 229 | |
| 230 | bool 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; |
no test coverage detected