Index: bolt/lib/Rewrite/RewriteInstance.cpp =================================================================== --- bolt/lib/Rewrite/RewriteInstance.cpp +++ bolt/lib/Rewrite/RewriteInstance.cpp @@ -422,6 +422,8 @@ if (Error E = PHsOrErr.takeError()) return E; + std::size_t MaxAlignment = + 1ULL << llvm::countr_zero(reinterpret_cast(Obj.base())); ELF64LE::PhdrRange PHs = PHsOrErr.get(); for (const ELF64LE::Phdr &Phdr : PHs) { switch (Phdr.p_type) { @@ -432,12 +434,19 @@ Phdr.p_vaddr + Phdr.p_memsz); NextAvailableOffset = std::max(NextAvailableOffset, Phdr.p_offset + Phdr.p_filesz); - +#if 0 + assert(Phdr.p_align <= MaxAlignment && + "Phdr alignment exceeds binary alignment"); BC->SegmentMapInfo[Phdr.p_vaddr] = SegmentInfo{Phdr.p_vaddr, Phdr.p_memsz, Phdr.p_offset, Phdr.p_filesz, Phdr.p_align}; +#else + BC->SegmentMapInfo[Phdr.p_vaddr] = + SegmentInfo{Phdr.p_vaddr, Phdr.p_memsz, Phdr.p_offset, + Phdr.p_filesz, std::min(Phdr.p_align, MaxAlignment)}; +#endif break; case ELF::PT_INTERP: BC->HasInterpHeader = true;