diff options
Diffstat (limited to 'lld/lib/ReaderWriter/ELF')
| -rw-r--r-- | lld/lib/ReaderWriter/ELF/HeaderChunks.h | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/lld/lib/ReaderWriter/ELF/HeaderChunks.h b/lld/lib/ReaderWriter/ELF/HeaderChunks.h index f274b703140..62a4374d015 100644 --- a/lld/lib/ReaderWriter/ELF/HeaderChunks.h +++ b/lld/lib/ReaderWriter/ELF/HeaderChunks.h @@ -226,11 +226,18 @@ bool ProgramHeader<ELFT>::addSegment(Segment<ELFT> *segment) { phdr->p_filesz = slice->fileSize(); phdr->p_memsz = slice->memSize(); phdr->p_flags = segment->flags(); + phdr->p_align = slice->align2(); + uint64_t segPageSize = segment->pageSize(); + uint64_t sliceAlign = slice->align2(); + // Alignment of PT_LOAD segments are set to the page size, but if the + // alignment of the slice is greater than the page size, set the alignment + // of the segment appropriately. if (outputMagic != ELFLinkingContext::OutputMagic::NMAGIC && - outputMagic != ELFLinkingContext::OutputMagic::OMAGIC) - phdr->p_align = (phdr->p_type == llvm::ELF::PT_LOAD) ? segment->pageSize() - : slice->align2(); - else + outputMagic != ELFLinkingContext::OutputMagic::OMAGIC) { + phdr->p_align = (phdr->p_type == llvm::ELF::PT_LOAD) + ? (segPageSize < sliceAlign) ? sliceAlign : segPageSize + : sliceAlign; + } else phdr->p_align = slice->align2(); } this->_fsize = fileSize(); |

