diff options
Diffstat (limited to 'lld')
| -rw-r--r-- | lld/lib/ReaderWriter/ELF/HeaderChunks.h | 15 | ||||
| -rw-r--r-- | lld/test/elf/phdr.test | 2 |
2 files changed, 12 insertions, 5 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(); diff --git a/lld/test/elf/phdr.test b/lld/test/elf/phdr.test index 2b407ab2be6..10f4daeb467 100644 --- a/lld/test/elf/phdr.test +++ b/lld/test/elf/phdr.test @@ -68,7 +68,7 @@ I386-NEXT: Flags [ (0x6) I386-NEXT: PF_R (0x4) I386-NEXT: PF_W (0x2) I386-NEXT: ] -I386-NEXT: Alignment: 4096 +I386-NEXT: Alignment: 16384 I386-NEXT: } I386-NEXT: ProgramHeader { I386-NEXT: Type: PT_GNU_EH_FRAME (0x6474E550) |

