summaryrefslogtreecommitdiffstats
path: root/lld
diff options
context:
space:
mode:
Diffstat (limited to 'lld')
-rw-r--r--lld/lib/ReaderWriter/ELF/HeaderChunks.h15
-rw-r--r--lld/test/elf/phdr.test2
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)
OpenPOWER on IntegriCloud