Index: ELF/Target.h =================================================================== --- ELF/Target.h +++ ELF/Target.h @@ -21,6 +21,7 @@ class TargetInfo { public: llvm::StringRef getDefaultEntry() const { return DefaultEntry; } + unsigned getVAStart() const { return VAStart; } unsigned getPCRelReloc() const { return PCRelReloc; } unsigned getGotReloc() const { return GotReloc; } unsigned getGotRefReloc() const { return GotRefReloc; } @@ -38,6 +39,7 @@ virtual ~TargetInfo(); protected: + unsigned VAStart; unsigned PCRelReloc; unsigned GotRefReloc; unsigned GotReloc; Index: ELF/Target.cpp =================================================================== --- ELF/Target.cpp +++ ELF/Target.cpp @@ -36,6 +36,7 @@ PCRelReloc = R_386_PC32; GotReloc = R_386_GLOB_DAT; GotRefReloc = R_386_GOT32; + VAStart = 0x10000; } void X86TargetInfo::writePltEntry(uint8_t *Buf, uint64_t GotEntryAddr, @@ -93,6 +94,14 @@ GotReloc = R_X86_64_GLOB_DAT; GotRefReloc = R_X86_64_PC32; RelativeReloc = R_X86_64_RELATIVE; + + // On freebsd x86_64 the first page cannot be mmaped. + // On linux that is controled by vm.mmap_min_addr. At least on some x86_64 + // installs that is 65536, so the first 15 pages cannot be used. + // Given that, the smallest value that can be used in here is 0x10000. + // If using 2MB pages, the smallest page aligned address that works is + // 0x200000, but it looks like every OS uses 4k pages for executables. + VAStart = 0x10000; } void X86_64TargetInfo::writePltEntry(uint8_t *Buf, uint64_t GotEntryAddr, @@ -194,6 +203,7 @@ PPC64TargetInfo::PPC64TargetInfo() { // PCRelReloc = FIXME // GotReloc = FIXME + VAStart = 0x10000000; } void PPC64TargetInfo::writePltEntry(uint8_t *Buf, uint64_t GotEntryAddr, uint64_t PltEntryAddr) const {} @@ -227,6 +237,7 @@ PPCTargetInfo::PPCTargetInfo() { // PCRelReloc = FIXME // GotReloc = FIXME + VAStart = 0x10000000; } void PPCTargetInfo::writePltEntry(uint8_t *Buf, uint64_t GotEntryAddr, uint64_t PltEntryAddr) const {} @@ -243,6 +254,7 @@ ARMTargetInfo::ARMTargetInfo() { // PCRelReloc = FIXME // GotReloc = FIXME + VAStart = 0x8000; } void ARMTargetInfo::writePltEntry(uint8_t *Buf, uint64_t GotEntryAddr, uint64_t PltEntryAddr) const {} @@ -259,6 +271,7 @@ AArch64TargetInfo::AArch64TargetInfo() { // PCRelReloc = FIXME // GotReloc = FIXME + VAStart = 0x400000; } void AArch64TargetInfo::writePltEntry(uint8_t *Buf, uint64_t GotEntryAddr, uint64_t PltEntryAddr) const {} @@ -338,6 +351,7 @@ // PCRelReloc = FIXME // GotReloc = FIXME DefaultEntry = "__start"; + VAStart = 0x400000; } void MipsTargetInfo::writePltEntry(uint8_t *Buf, uint64_t GotEntryAddr, Index: ELF/Writer.cpp =================================================================== --- ELF/Writer.cpp +++ ELF/Writer.cpp @@ -24,15 +24,6 @@ static const int PageSize = 4096; -// On freebsd x86_64 the first page cannot be mmaped. -// On linux that is controled by vm.mmap_min_addr. At least on some x86_64 -// installs that is 65536, so the first 15 pages cannot be used. -// Given that, the smallest value that can be used in here is 0x10000. -// If using 2MB pages, the smallest page aligned address that works is -// 0x200000, but it looks like every OS uses 4k pages for executables. -// FIXME: This is architecture and OS dependent. -static const int VAStart = 0x10000; - namespace { static uint32_t toPHDRFlags(uint64_t Flags) { @@ -102,7 +93,7 @@ return !Symtab.getSharedFiles().empty() || Config->Shared; } bool needsDynamicSections() const { return isOutputDynamic(); } - unsigned getVAStart() const { return Config->Shared ? 0 : VAStart; } + unsigned getVAStart() const { return Config->Shared ? 0 : Target->getVAStart(); } std::unique_ptr Buffer; Index: test/elf2/aarch64-relocs.s =================================================================== --- test/elf2/aarch64-relocs.s +++ test/elf2/aarch64-relocs.s @@ -29,7 +29,7 @@ # # CHECK: Disassembly of section .R_AARCH64_ADR_PREL_PG_H121: # CHECK-NEXT: $x.2: -# CHECK-NEXT: 11012: 01 00 00 90 adrp x1, #0 +# CHECK-NEXT: 401012: 01 00 00 90 adrp x1, #0 .section .R_AARCH64_ADD_ABS_LO12_NC,"ax",@progbits add x0, x0, :lo12:.L.str @@ -43,4 +43,4 @@ # # CHECK: Disassembly of section .R_AARCH64_ADD_ABS_LO12_NC: # CHECK-NEXT: $x.4: -# CHECK-NEXT: 1101b: 00 7c 00 91 add x0, x0, #31 +# CHECK-NEXT: 40101b: 00 7c 00 91 add x0, x0, #31 Index: test/elf2/basic-aarch64.s =================================================================== --- test/elf2/basic-aarch64.s +++ test/elf2/basic-aarch64.s @@ -59,7 +59,7 @@ # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_EXECINSTR (0x4) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x11000 +# CHECK-NEXT: Address: 0x401000 # CHECK-NEXT: Offset: 0x1000 # CHECK-NEXT: Size: 12 # CHECK-NEXT: Link: 0 @@ -75,7 +75,7 @@ # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_WRITE (0x1) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x1100C +# CHECK-NEXT: Address: 0x40100C # CHECK-NEXT: Offset: 0x100C # CHECK-NEXT: Size: 0 # CHECK-NEXT: Link: 0 @@ -91,7 +91,7 @@ # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_WRITE (0x1) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x1100C +# CHECK-NEXT: Address: 0x40100C # CHECK-NEXT: Offset: 0x100C # CHECK-NEXT: Size: 0 # CHECK-NEXT: Link: 0 @@ -140,7 +140,7 @@ # CHECK-NEXT: } # CHECK-NEXT: Symbol { # CHECK-NEXT: Name: $x.0 (41) -# CHECK-NEXT: Value: 0x11000 +# CHECK-NEXT: Value: 0x401000 # CHECK-NEXT: Size: 0 # CHECK-NEXT: Binding: Local (0x0) # CHECK-NEXT: Type: None (0x0) @@ -161,8 +161,8 @@ # CHECK-NEXT: ProgramHeader { # CHECK-NEXT: Type: PT_LOAD (0x1) # CHECK-NEXT: Offset: 0x0 -# CHECK-NEXT: VirtualAddress: 0x10000 -# CHECK-NEXT: PhysicalAddress: 0x10000 +# CHECK-NEXT: VirtualAddress: 0x400000 +# CHECK-NEXT: PhysicalAddress: 0x400000 # CHECK-NEXT: FileSize: 176 # CHECK-NEXT: MemSize: 176 # CHECK-NEXT: Flags [ @@ -173,8 +173,8 @@ # CHECK-NEXT: ProgramHeader { # CHECK-NEXT: Type: PT_LOAD (0x1) # CHECK-NEXT: Offset: 0x1000 -# CHECK-NEXT: VirtualAddress: 0x11000 -# CHECK-NEXT: PhysicalAddress: 0x11000 +# CHECK-NEXT: VirtualAddress: 0x401000 +# CHECK-NEXT: PhysicalAddress: 0x401000 # CHECK-NEXT: FileSize: 12 # CHECK-NEXT: MemSize: 12 # CHECK-NEXT: Flags [ (0x5) Index: test/elf2/basic-mips.s =================================================================== --- test/elf2/basic-mips.s +++ test/elf2/basic-mips.s @@ -25,7 +25,7 @@ # CHECK-NEXT: Type: Executable (0x2) # CHECK-NEXT: Machine: EM_MIPS (0x8) # CHECK-NEXT: Version: 1 -# CHECK-NEXT: Entry: 0x12000 +# CHECK-NEXT: Entry: 0x402000 # CHECK-NEXT: ProgramHeaderOffset: 0x34 # CHECK-NEXT: SectionHeaderOffset: 0x2074 # CHECK-NEXT: Flags [ (0x0) @@ -59,7 +59,7 @@ # CHECK-NEXT: Flags [ (0x2) # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x11000 +# CHECK-NEXT: Address: 0x401000 # CHECK-NEXT: Offset: 0x1000 # CHECK-NEXT: Size: 24 # CHECK-NEXT: Link: 0 @@ -74,7 +74,7 @@ # CHECK-NEXT: Flags [ (0x2) # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x11018 +# CHECK-NEXT: Address: 0x401018 # CHECK-NEXT: Offset: 0x1018 # CHECK-NEXT: Size: 24 # CHECK-NEXT: Link: 0 @@ -90,7 +90,7 @@ # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_EXECINSTR (0x4) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x12000 +# CHECK-NEXT: Address: 0x402000 # CHECK-NEXT: Offset: 0x2000 # CHECK-NEXT: Size: 12 # CHECK-NEXT: Link: 0 @@ -106,7 +106,7 @@ # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_WRITE (0x1) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x12010 +# CHECK-NEXT: Address: 0x402010 # CHECK-NEXT: Offset: 0x2010 # CHECK-NEXT: Size: 0 # CHECK-NEXT: Link: 0 @@ -122,7 +122,7 @@ # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_WRITE (0x1) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x12010 +# CHECK-NEXT: Address: 0x402010 # CHECK-NEXT: Offset: 0x2010 # CHECK-NEXT: Size: 0 # CHECK-NEXT: Link: 0 @@ -171,7 +171,7 @@ # CHECK-NEXT: } # CHECK-NEXT: Symbol { # CHECK-NEXT: Name: __start (7) -# CHECK-NEXT: Value: 0x12000 +# CHECK-NEXT: Value: 0x402000 # CHECK-NEXT: Size: 0 # CHECK-NEXT: Binding: Global (0x1) # CHECK-NEXT: Type: None (0x0) @@ -183,8 +183,8 @@ # CHECK-NEXT: ProgramHeader { # CHECK-NEXT: Type: PT_LOAD (0x1) # CHECK-NEXT: Offset: 0x0 -# CHECK-NEXT: VirtualAddress: 0x10000 -# CHECK-NEXT: PhysicalAddress: 0x10000 +# CHECK-NEXT: VirtualAddress: 0x400000 +# CHECK-NEXT: PhysicalAddress: 0x400000 # CHECK-NEXT: FileSize: 4144 # CHECK-NEXT: MemSize: 4144 # CHECK-NEXT: Flags [ (0x4) @@ -195,8 +195,8 @@ # CHECK-NEXT: ProgramHeader { # CHECK-NEXT: Type: PT_LOAD (0x1) # CHECK-NEXT: Offset: 0x2000 -# CHECK-NEXT: VirtualAddress: 0x12000 -# CHECK-NEXT: PhysicalAddress: 0x12000 +# CHECK-NEXT: VirtualAddress: 0x402000 +# CHECK-NEXT: PhysicalAddress: 0x402000 # CHECK-NEXT: FileSize: 16 # CHECK-NEXT: MemSize: 16 # CHECK-NEXT: Flags [ (0x5) Index: test/elf2/basic32be.s =================================================================== --- test/elf2/basic32be.s +++ test/elf2/basic32be.s @@ -23,7 +23,7 @@ # CHECK-NEXT: Type: Executable (0x2) # CHECK-NEXT: Machine: EM_PPC (0x14) # CHECK-NEXT: Version: 1 -# CHECK-NEXT: Entry: 0x11000 +# CHECK-NEXT: Entry: 0x10001000 # CHECK-NEXT: ProgramHeaderOffset: 0x34 # CHECK-NEXT: SectionHeaderOffset: 0x1058 # CHECK-NEXT: Flags [ (0x0) @@ -58,7 +58,7 @@ # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_EXECINSTR (0x4) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x11000 +# CHECK-NEXT: Address: 0x10001000 # CHECK-NEXT: Offset: 0x1000 # CHECK-NEXT: Size: 12 # CHECK-NEXT: Link: 0 @@ -74,7 +74,7 @@ # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_WRITE (0x1) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x1100C +# CHECK-NEXT: Address: 0x1000100C # CHECK-NEXT: Offset: 0x100C # CHECK-NEXT: Size: 0 # CHECK-NEXT: Link: 0 @@ -90,7 +90,7 @@ # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_WRITE (0x1) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x1100C +# CHECK-NEXT: Address: 0x1000100C # CHECK-NEXT: Offset: 0x100C # CHECK-NEXT: Size: 0 # CHECK-NEXT: Link: 0 @@ -131,8 +131,8 @@ # CHECK-NEXT: ProgramHeader { # CHECK-NEXT: Type: PT_LOAD (0x1) # CHECK-NEXT: Offset: 0x0 -# CHECK-NEXT: VirtualAddress: 0x10000 -# CHECK-NEXT: PhysicalAddress: 0x10000 +# CHECK-NEXT: VirtualAddress: 0x10000000 +# CHECK-NEXT: PhysicalAddress: 0x10000000 # CHECK-NEXT: FileSize: 116 # CHECK-NEXT: MemSize: 116 # CHECK-NEXT: Flags [ @@ -143,8 +143,8 @@ # CHECK-NEXT: ProgramHeader { # CHECK-NEXT: Type: PT_LOAD (0x1) # CHECK-NEXT: Offset: 0x1000 -# CHECK-NEXT: VirtualAddress: 0x11000 -# CHECK-NEXT: PhysicalAddress: 0x11000 +# CHECK-NEXT: VirtualAddress: 0x10001000 +# CHECK-NEXT: PhysicalAddress: 0x10001000 # CHECK-NEXT: FileSize: 12 # CHECK-NEXT: MemSize: 12 # CHECK-NEXT: Flags [ (0x5) Index: test/elf2/basic64be.s =================================================================== --- test/elf2/basic64be.s +++ test/elf2/basic64be.s @@ -28,7 +28,7 @@ # CHECK-NEXT: Type: Executable (0x2) # CHECK-NEXT: Machine: EM_PPC64 (0x15) # CHECK-NEXT: Version: 1 -# CHECK-NEXT: Entry: 0x12000 +# CHECK-NEXT: Entry: 0x10002000 # CHECK-NEXT: ProgramHeaderOffset: 0x40 # CHECK-NEXT: SectionHeaderOffset: 0x2078 # CHECK-NEXT: Flags [ (0x0) @@ -65,7 +65,7 @@ # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_EXECINSTR (0x4) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x11000 +# CHECK-NEXT: Address: 0x10001000 # CHECK-NEXT: Offset: 0x1000 # CHECK-NEXT: Size: 12 # CHECK-NEXT: Link: 0 @@ -83,7 +83,7 @@ # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_WRITE (0x1) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x1100C +# CHECK-NEXT: Address: 0x1000100C # CHECK-NEXT: Offset: 0x100C # CHECK-NEXT: Size: 0 # CHECK-NEXT: Link: 0 @@ -101,7 +101,7 @@ # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_WRITE (0x1) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x12000 +# CHECK-NEXT: Address: 0x10002000 # 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 00011000 00000000 00000000 |................| +# CHECK-NEXT: 0000: 00000000 10001000 00000000 00000000 |................| # CHECK-NEXT: 0010: 00000000 00000000 |........| # CHECK-NEXT: ) # CHECK-NEXT: } @@ -121,7 +121,7 @@ # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_WRITE (0x1) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x12018 +# CHECK-NEXT: Address: 0x10002018 # CHECK-NEXT: Offset: 0x2018 # CHECK-NEXT: Size: 0 # CHECK-NEXT: Link: 0 @@ -166,8 +166,8 @@ # CHECK-NEXT: ProgramHeader { # CHECK-NEXT: Type: PT_LOAD (0x1) # CHECK-NEXT: Offset: 0x0 -# CHECK-NEXT: VirtualAddress: 0x10000 -# CHECK-NEXT: PhysicalAddress: 0x10000 +# CHECK-NEXT: VirtualAddress: 0x10000000 +# CHECK-NEXT: PhysicalAddress: 0x10000000 # CHECK-NEXT: FileSize: 232 # CHECK-NEXT: MemSize: 232 # CHECK-NEXT: Flags [ @@ -178,8 +178,8 @@ # CHECK-NEXT: ProgramHeader { # CHECK-NEXT: Type: PT_LOAD (0x1) # CHECK-NEXT: Offset: 0x1000 -# CHECK-NEXT: VirtualAddress: 0x11000 -# CHECK-NEXT: PhysicalAddress: 0x11000 +# CHECK-NEXT: VirtualAddress: 0x10001000 +# CHECK-NEXT: PhysicalAddress: 0x10001000 # CHECK-NEXT: FileSize: 12 # CHECK-NEXT: MemSize: 12 # CHECK-NEXT: Flags [ (0x5) @@ -191,8 +191,8 @@ # CHECK-NEXT: ProgramHeader { # CHECK-NEXT: Type: PT_LOAD (0x1) # CHECK-NEXT: Offset: 0x2000 -# CHECK-NEXT: VirtualAddress: 0x12000 -# CHECK-NEXT: PhysicalAddress: 0x12000 +# CHECK-NEXT: VirtualAddress: 0x10002000 +# CHECK-NEXT: PhysicalAddress: 0x10002000 # CHECK-NEXT: FileSize: 24 # CHECK-NEXT: MemSize: 24 # CHECK-NEXT: Flags [ (0x6) Index: test/elf2/emulation.s =================================================================== --- test/elf2/emulation.s +++ test/elf2/emulation.s @@ -78,7 +78,7 @@ # PPC64-NEXT: Type: Executable (0x2) # PPC64-NEXT: Machine: EM_PPC64 (0x15) # PPC64-NEXT: Version: 1 -# PPC64-NEXT: Entry: 0x11000 +# PPC64-NEXT: Entry: 0x10001000 # PPC64-NEXT: ProgramHeaderOffset: 0x40 # PPC64-NEXT: SectionHeaderOffset: 0x1060 # PPC64-NEXT: Flags [ (0x0) @@ -109,7 +109,7 @@ # PPC-NEXT: Type: Executable (0x2) # PPC-NEXT: Machine: EM_PPC (0x14) # PPC-NEXT: Version: 1 -# PPC-NEXT: Entry: 0x11000 +# PPC-NEXT: Entry: 0x10001000 # PPC-NEXT: ProgramHeaderOffset: 0x34 # PPC-NEXT: SectionHeaderOffset: 0x104C # PPC-NEXT: Flags [ (0x0)