Index: lld/trunk/ELF/Writer.h =================================================================== --- lld/trunk/ELF/Writer.h +++ lld/trunk/ELF/Writer.h @@ -9,6 +9,7 @@ #ifndef LLD_ELF_WRITER_H #define LLD_ELF_WRITER_H +#include "Config.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringRef.h" #include @@ -28,7 +29,9 @@ // Each contains type, access flags and range of output sections that will be // placed in it. struct PhdrEntry { - PhdrEntry(unsigned type, unsigned flags) : p_type(type), p_flags(flags) {} + PhdrEntry(unsigned type, unsigned flags) + : p_align(type == llvm::ELF::PT_LOAD ? config->maxPageSize : 0), + p_type(type), p_flags(flags) {} void add(OutputSection *sec); uint64_t p_paddr = 0; Index: lld/trunk/ELF/Writer.cpp =================================================================== --- lld/trunk/ELF/Writer.cpp +++ lld/trunk/ELF/Writer.cpp @@ -2270,12 +2270,9 @@ // load executables without any address adjustment. static uint64_t computeFileOffset(OutputSection *os, uint64_t off) { // The first section in a PT_LOAD has to have congruent offset and address - // module the page size. - if (os->ptLoad && os->ptLoad->firstSec == os) { - uint64_t alignment = - std::max(os->ptLoad->p_align, config->maxPageSize); - return alignTo(off, alignment, os->addr); - } + // modulo the maximum page size. + if (os->ptLoad && os->ptLoad->firstSec == os) + return alignTo(off, os->ptLoad->p_align, os->addr); // File offsets are not significant for .bss sections other than the first one // in a PT_LOAD. By convention, we keep section offsets monotonically @@ -2385,9 +2382,7 @@ p->p_paddr = first->getLMA(); } - if (p->p_type == PT_LOAD) { - p->p_align = std::max(p->p_align, config->maxPageSize); - } else if (p->p_type == PT_GNU_RELRO) { + if (p->p_type == PT_GNU_RELRO) { p->p_align = 1; // musl/glibc ld.so rounds the size down, so we need to round up // to protect the last page. This is a no-op on FreeBSD which always