Index: ELF/Target.h =================================================================== --- ELF/Target.h +++ ELF/Target.h @@ -21,6 +21,7 @@ class TargetInfo { public: llvm::StringRef getDefaultEntry() const { return DefaultEntry; } + unsigned getPageSize() const { return PageSize; } uint64_t getVAStart() const { return VAStart; } unsigned getPCRelReloc() const { return PCRelReloc; } unsigned getGotReloc() const { return GotReloc; } @@ -39,6 +40,7 @@ virtual ~TargetInfo(); protected: + unsigned PageSize = 4096; uint64_t VAStart; unsigned PCRelReloc; unsigned GotRefReloc; Index: ELF/Target.cpp =================================================================== --- ELF/Target.cpp +++ ELF/Target.cpp @@ -202,6 +202,7 @@ // PCRelReloc = FIXME // GotReloc = FIXME PltEntrySize = 32; + PageSize = 65536; VAStart = 0x10000000; } void PPC64TargetInfo::writePltEntry(uint8_t *Buf, uint64_t GotEntryAddr, @@ -235,6 +236,7 @@ PPCTargetInfo::PPCTargetInfo() { // PCRelReloc = FIXME // GotReloc = FIXME + PageSize = 65536; VAStart = 0x10000000; } void PPCTargetInfo::writePltEntry(uint8_t *Buf, uint64_t GotEntryAddr, @@ -347,6 +349,7 @@ // PCRelReloc = FIXME // GotReloc = FIXME DefaultEntry = "__start"; + PageSize = 65536; VAStart = 0x400000; } Index: ELF/Writer.cpp =================================================================== --- ELF/Writer.cpp +++ ELF/Writer.cpp @@ -22,8 +22,6 @@ using namespace lld; using namespace lld::elf2; -static const int PageSize = 4096; - namespace { static uint32_t toPHDRFlags(uint64_t Flags) { @@ -43,7 +41,7 @@ std::memset(&Header, 0, sizeof(Elf_Phdr)); Header.p_type = Type; Header.p_flags = Flags; - Header.p_align = PageSize; + Header.p_align = Target->getPageSize(); Header.p_offset = FileOff; Header.p_vaddr = VA; Header.p_paddr = VA; @@ -484,8 +482,8 @@ // Reserve space for PHDRs. ProgramHeaderOff = FileOff; - FileOff = RoundUpToAlignment(FileOff, PageSize); - VA = RoundUpToAlignment(VA, PageSize); + FileOff = RoundUpToAlignment(FileOff, Target->getPageSize()); + VA = RoundUpToAlignment(VA, Target->getPageSize()); if (needsInterpSection()) PHDRs.push_back(&InterpPHDR); @@ -494,7 +492,7 @@ PHDRs.push_back(&FileHeaderPHDR); FileHeaderPHDR.Header.p_vaddr = getVAStart(); FileHeaderPHDR.Header.p_paddr = getVAStart(); - FileHeaderPHDR.Header.p_align = PageSize; + FileHeaderPHDR.Header.p_align = Target->getPageSize(); for (OutputSectionBase *Sec : OutputSections) { Out::StrTab->add(Sec->getName()); @@ -512,8 +510,8 @@ } if (needsPHDR(Sec)) { - VA = RoundUpToAlignment(VA, PageSize); - FileOff = RoundUpToAlignment(FileOff, PageSize); + VA = RoundUpToAlignment(VA, Target->getPageSize()); + FileOff = RoundUpToAlignment(FileOff, Target->getPageSize()); PHDRs.push_back(new (PAlloc) ProgramHeader(PT_LOAD, Flags, FileOff, VA)); } @@ -579,7 +577,7 @@ EHdr->e_shstrndx = Out::StrTab->getSectionIndex(); // If nothing was merged into the file header PT_LOAD, set the size correctly. - if (FileHeaderPHDR.Header.p_filesz == PageSize) { + if (FileHeaderPHDR.Header.p_filesz == Target->getPageSize()) { uint64_t Size = sizeof(Elf_Ehdr) + sizeof(Elf_Phdr) * PHDRs.size(); FileHeaderPHDR.Header.p_filesz = Size; FileHeaderPHDR.Header.p_memsz = Size; Index: test/elf2/basic-mips.s =================================================================== --- test/elf2/basic-mips.s +++ test/elf2/basic-mips.s @@ -27,7 +27,7 @@ # CHECK-NEXT: Version: 1 # CHECK-NEXT: Entry: 0x402000 # CHECK-NEXT: ProgramHeaderOffset: 0x34 -# CHECK-NEXT: SectionHeaderOffset: 0x2074 +# CHECK-NEXT: SectionHeaderOffset: 0x20074 # CHECK-NEXT: Flags [ (0x0) # CHECK-NEXT: ] # CHECK-NEXT: HeaderSize: 52 @@ -59,7 +59,7 @@ # CHECK-NEXT: Flags [ (0x2) # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x401000 +# CHECK-NEXT: Address: 0x410000 # CHECK-NEXT: Offset: 0x1000 # CHECK-NEXT: Size: 24 # CHECK-NEXT: Link: 0 @@ -74,8 +74,8 @@ # CHECK-NEXT: Flags [ (0x2) # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x401018 -# CHECK-NEXT: Offset: 0x1018 +# CHECK-NEXT: Address: 0x410018 +# CHECK-NEXT: Offset: 0x10018 # CHECK-NEXT: Size: 24 # CHECK-NEXT: Link: 0 # CHECK-NEXT: Info: 0 @@ -90,7 +90,7 @@ # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_EXECINSTR (0x4) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x402000 +# CHECK-NEXT: Address: 0x420000 # CHECK-NEXT: Offset: 0x2000 # CHECK-NEXT: Size: 12 # CHECK-NEXT: Link: 0 @@ -106,8 +106,8 @@ # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_WRITE (0x1) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x402010 -# CHECK-NEXT: Offset: 0x2010 +# CHECK-NEXT: Address: 0x420010 +# CHECK-NEXT: Offset: 0x20010 # CHECK-NEXT: Size: 0 # CHECK-NEXT: Link: 0 # CHECK-NEXT: Info: 0 @@ -122,8 +122,8 @@ # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_WRITE (0x1) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x402010 -# CHECK-NEXT: Offset: 0x2010 +# CHECK-NEXT: Address: 0x420010 +# CHECK-NEXT: Offset: 0x20010 # CHECK-NEXT: Size: 0 # CHECK-NEXT: Link: 0 # CHECK-NEXT: Info: 0 @@ -137,7 +137,7 @@ # CHECK-NEXT: Flags [ (0x0) # CHECK-NEXT: ] # CHECK-NEXT: Address: 0x0 -# CHECK-NEXT: Offset: 0x2010 +# CHECK-NEXT: Offset: 0x20010 # CHECK-NEXT: Size: 32 # CHECK-NEXT: Link: 7 # CHECK-NEXT: Info: 1 @@ -151,7 +151,7 @@ # CHECK-NEXT: Flags [ (0x0) # CHECK-NEXT: ] # CHECK-NEXT: Address: 0x0 -# CHECK-NEXT: Offset: 0x2030 +# CHECK-NEXT: Offset: 0x20030 # CHECK-NEXT: Size: 66 # CHECK-NEXT: Link: 0 # CHECK-NEXT: Info: 0 @@ -171,7 +171,7 @@ # CHECK-NEXT: } # CHECK-NEXT: Symbol { # CHECK-NEXT: Name: __start (7) -# CHECK-NEXT: Value: 0x402000 +# CHECK-NEXT: Value: 0x420000 # CHECK-NEXT: Size: 0 # CHECK-NEXT: Binding: Global (0x1) # CHECK-NEXT: Type: None (0x0) @@ -185,12 +185,12 @@ # CHECK-NEXT: Offset: 0x0 # CHECK-NEXT: VirtualAddress: 0x400000 # CHECK-NEXT: PhysicalAddress: 0x400000 -# CHECK-NEXT: FileSize: 4144 -# CHECK-NEXT: MemSize: 4144 +# CHECK-NEXT: FileSize: 65584 +# CHECK-NEXT: MemSize: 65584 # CHECK-NEXT: Flags [ (0x4) # CHECK-NEXT: PF_R (0x4) # CHECK-NEXT: ] -# CHECK-NEXT: Alignment: 4096 +# CHECK-NEXT: Alignment: 65536 # CHECK-NEXT: } # CHECK-NEXT: ProgramHeader { # CHECK-NEXT: Type: PT_LOAD (0x1) @@ -203,6 +203,6 @@ # CHECK-NEXT: PF_R (0x4) # CHECK-NEXT: PF_X (0x1) # CHECK-NEXT: ] -# CHECK-NEXT: Alignment: 4096 +# CHECK-NEXT: Alignment: 65536 # CHECK-NEXT: } # CHECK-NEXT: ] Index: test/elf2/basic32be.s =================================================================== --- test/elf2/basic32be.s +++ test/elf2/basic32be.s @@ -23,9 +23,9 @@ # CHECK-NEXT: Type: Executable (0x2) # CHECK-NEXT: Machine: EM_PPC (0x14) # CHECK-NEXT: Version: 1 -# CHECK-NEXT: Entry: 0x10001000 +# CHECK-NEXT: Entry: 0x10010000 # CHECK-NEXT: ProgramHeaderOffset: 0x34 -# CHECK-NEXT: SectionHeaderOffset: 0x1058 +# CHECK-NEXT: SectionHeaderOffset: 0x10058 # CHECK-NEXT: Flags [ (0x0) # CHECK-NEXT: ] # CHECK-NEXT: HeaderSize: 52 @@ -58,7 +58,7 @@ # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_EXECINSTR (0x4) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x10001000 +# CHECK-NEXT: Address: 0x10010000 # CHECK-NEXT: Offset: 0x1000 # CHECK-NEXT: Size: 12 # CHECK-NEXT: Link: 0 @@ -74,8 +74,8 @@ # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_WRITE (0x1) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x1000100C -# CHECK-NEXT: Offset: 0x100C +# CHECK-NEXT: Address: 0x1001000C +# CHECK-NEXT: Offset: 0x1000C # CHECK-NEXT: Size: 0 # CHECK-NEXT: Link: 0 # CHECK-NEXT: Info: 0 @@ -90,8 +90,8 @@ # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_WRITE (0x1) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x1000100C -# CHECK-NEXT: Offset: 0x100C +# CHECK-NEXT: Address: 0x1001000C +# CHECK-NEXT: Offset: 0x1000C # CHECK-NEXT: Size: 0 # CHECK-NEXT: Link: 0 # CHECK-NEXT: Info: 0 @@ -105,7 +105,7 @@ # CHECK-NEXT: Flags [ # CHECK-NEXT: ] # CHECK-NEXT: Address: 0x0 -# CHECK-NEXT: Offset: 0x100C +# CHECK-NEXT: Offset: 0x1000C # CHECK-NEXT: Size: 32 # CHECK-NEXT: Link: 5 # CHECK-NEXT: Info: 1 @@ -119,7 +119,7 @@ # CHECK-NEXT: Flags [ (0x0) # CHECK-NEXT: ] # CHECK-NEXT: Address: 0x0 -# CHECK-NEXT: Offset: 0x102C +# CHECK-NEXT: Offset: 0x1002C # CHECK-NEXT: Size: 41 # CHECK-NEXT: Link: 0 # CHECK-NEXT: Info: 0 @@ -138,19 +138,19 @@ # CHECK-NEXT: Flags [ # CHECK-NEXT: PF_R # CHECK-NEXT: ] -# CHECK-NEXT: Alignment: 4096 +# CHECK-NEXT: Alignment: 65536 # CHECK-NEXT: } # CHECK-NEXT: ProgramHeader { # CHECK-NEXT: Type: PT_LOAD (0x1) # CHECK-NEXT: Offset: 0x1000 -# CHECK-NEXT: VirtualAddress: 0x10001000 -# CHECK-NEXT: PhysicalAddress: 0x10001000 +# CHECK-NEXT: VirtualAddress: 0x10010000 +# CHECK-NEXT: PhysicalAddress: 0x10010000 # CHECK-NEXT: FileSize: 12 # CHECK-NEXT: MemSize: 12 # CHECK-NEXT: Flags [ (0x5) # CHECK-NEXT: PF_R (0x4) # CHECK-NEXT: PF_X (0x1) # CHECK-NEXT: ] -# CHECK-NEXT: Alignment: 4096 +# CHECK-NEXT: Alignment: 65536 # CHECK-NEXT: } # CHECK-NEXT: ] Index: test/elf2/basic64be.s =================================================================== --- test/elf2/basic64be.s +++ test/elf2/basic64be.s @@ -28,9 +28,9 @@ # CHECK-NEXT: Type: Executable (0x2) # CHECK-NEXT: Machine: EM_PPC64 (0x15) # CHECK-NEXT: Version: 1 -# CHECK-NEXT: Entry: 0x10002000 +# CHECK-NEXT: Entry: 0x10020000 # CHECK-NEXT: ProgramHeaderOffset: 0x40 -# CHECK-NEXT: SectionHeaderOffset: 0x2078 +# CHECK-NEXT: SectionHeaderOffset: 0x20078 # CHECK-NEXT: Flags [ (0x0) # CHECK-NEXT: ] # CHECK-NEXT: HeaderSize: 64 @@ -65,7 +65,7 @@ # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_EXECINSTR (0x4) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x10001000 +# CHECK-NEXT: Address: 0x10010000 # CHECK-NEXT: Offset: 0x1000 # CHECK-NEXT: Size: 12 # CHECK-NEXT: Link: 0 @@ -83,8 +83,8 @@ # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_WRITE (0x1) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x1000100C -# CHECK-NEXT: Offset: 0x100C +# CHECK-NEXT: Address: 0x1001000C +# CHECK-NEXT: Offset: 0x1000C # CHECK-NEXT: Size: 0 # CHECK-NEXT: Link: 0 # CHECK-NEXT: Info: 0 @@ -101,7 +101,7 @@ # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_WRITE (0x1) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x10002000 +# CHECK-NEXT: Address: 0x10020000 # CHECK-NEXT: Offset: 0x2000 # CHECK-NEXT: Size: 24 # CHECK-NEXT: Link: 0 @@ -109,7 +109,7 @@ # CHECK-NEXT: AddressAlignment: 1 # CHECK-NEXT: EntrySize: 0 # CHECK-NEXT: SectionData ( -# CHECK-NEXT: 0000: 00000000 10001000 00000000 00000000 |................| +# CHECK-NEXT: 0000: 00000000 10010000 00000000 00000000 |................| # CHECK-NEXT: 0010: 00000000 00000000 |........| # CHECK-NEXT: ) # CHECK-NEXT: } @@ -121,8 +121,8 @@ # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_WRITE (0x1) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x10002018 -# CHECK-NEXT: Offset: 0x2018 +# CHECK-NEXT: Address: 0x10020018 +# CHECK-NEXT: Offset: 0x20018 # CHECK-NEXT: Size: 0 # CHECK-NEXT: Link: 0 # CHECK-NEXT: Info: 0 @@ -136,7 +136,7 @@ # CHECK-NEXT: Flags [ # CHECK-NEXT: ] # CHECK-NEXT: Address: 0x0 -# CHECK-NEXT: Offset: 0x2018 +# CHECK-NEXT: Offset: 0x20018 # CHECK-NEXT: Size: 48 # CHECK-NEXT: Link: 6 # CHECK-NEXT: Info: 1 @@ -152,7 +152,7 @@ # CHECK-NEXT: Flags [ (0x0) # CHECK-NEXT: ] # CHECK-NEXT: Address: 0x0 -# CHECK-NEXT: Offset: 0x2048 +# CHECK-NEXT: Offset: 0x20048 # CHECK-NEXT: Size: 46 # CHECK-NEXT: Link: 0 # CHECK-NEXT: Info: 0 @@ -173,32 +173,32 @@ # CHECK-NEXT: Flags [ # CHECK-NEXT: PF_R # CHECK-NEXT: ] -# CHECK-NEXT: Alignment: 4096 +# CHECK-NEXT: Alignment: 65536 # CHECK-NEXT: } # CHECK-NEXT: ProgramHeader { # CHECK-NEXT: Type: PT_LOAD (0x1) # CHECK-NEXT: Offset: 0x1000 -# CHECK-NEXT: VirtualAddress: 0x10001000 -# CHECK-NEXT: PhysicalAddress: 0x10001000 +# CHECK-NEXT: VirtualAddress: 0x10010000 +# CHECK-NEXT: PhysicalAddress: 0x10010000 # CHECK-NEXT: FileSize: 12 # CHECK-NEXT: MemSize: 12 # CHECK-NEXT: Flags [ (0x5) # CHECK-NEXT: PF_R (0x4) # CHECK-NEXT: PF_X (0x1) # CHECK-NEXT: ] -# CHECK-NEXT: Alignment: 4096 +# CHECK-NEXT: Alignment: 65536 # CHECK-NEXT: } # CHECK-NEXT: ProgramHeader { # CHECK-NEXT: Type: PT_LOAD (0x1) # CHECK-NEXT: Offset: 0x2000 -# CHECK-NEXT: VirtualAddress: 0x10002000 -# CHECK-NEXT: PhysicalAddress: 0x10002000 +# CHECK-NEXT: VirtualAddress: 0x10020000 +# CHECK-NEXT: PhysicalAddress: 0x10020000 # CHECK-NEXT: FileSize: 24 # CHECK-NEXT: MemSize: 24 # CHECK-NEXT: Flags [ (0x6) # CHECK-NEXT: PF_R (0x4) # CHECK-NEXT: PF_W (0x2) # CHECK-NEXT: ] -# CHECK-NEXT: Alignment: 4096 +# CHECK-NEXT: Alignment: 65536 # CHECK-NEXT: } # CHECK-NEXT:] Index: test/elf2/emulation.s =================================================================== --- test/elf2/emulation.s +++ test/elf2/emulation.s @@ -78,9 +78,9 @@ # PPC64-NEXT: Type: Executable (0x2) # PPC64-NEXT: Machine: EM_PPC64 (0x15) # PPC64-NEXT: Version: 1 -# PPC64-NEXT: Entry: 0x10001000 +# PPC64-NEXT: Entry: 0x10010000 # PPC64-NEXT: ProgramHeaderOffset: 0x40 -# PPC64-NEXT: SectionHeaderOffset: 0x1060 +# PPC64-NEXT: SectionHeaderOffset: 0x10060 # PPC64-NEXT: Flags [ (0x0) # PPC64-NEXT: ] # PPC64-NEXT: HeaderSize: 64 @@ -109,9 +109,9 @@ # PPC-NEXT: Type: Executable (0x2) # PPC-NEXT: Machine: EM_PPC (0x14) # PPC-NEXT: Version: 1 -# PPC-NEXT: Entry: 0x10001000 +# PPC-NEXT: Entry: 0x10010000 # PPC-NEXT: ProgramHeaderOffset: 0x34 -# PPC-NEXT: SectionHeaderOffset: 0x104C +# PPC-NEXT: SectionHeaderOffset: 0x1004C # PPC-NEXT: Flags [ (0x0) # PPC-NEXT: ] # PPC-NEXT: HeaderSize: 52