Index: ELF/Writer.cpp =================================================================== --- ELF/Writer.cpp +++ ELF/Writer.cpp @@ -2030,27 +2030,33 @@ unsigned partNo = part.getNumber(); bool isMain = partNo == 1; - // The first phdr entry is PT_PHDR which describes the program header itself. - if (isMain) - addHdr(PT_PHDR, PF_R)->add(Out::programHeaders); - else - addHdr(PT_PHDR, PF_R)->add(part.programHeaders->getParent()); - - // PT_INTERP must be the second entry if exists. - if (OutputSection *cmd = findSection(".interp", partNo)) - addHdr(PT_INTERP, cmd->getPhdrFlags())->add(cmd); - // Add the first PT_LOAD segment for regular output sections. uint64_t flags = computeFlags(PF_R); PhdrEntry *load = nullptr; - // Add the headers. We will remove them if they don't fit. - // In the other partitions the headers are ordinary sections, so they don't - // need to be added here. - if (isMain) { - load = addHdr(PT_LOAD, flags); - load->add(Out::elfHeader); - load->add(Out::programHeaders); + // nmagic or omagic output does not have PT_PHDR, PT_INTERP, or the readonly + // PT_LOAD. + bool paged = !config->nmagic && !config->omagic; + if (paged) { + // The first phdr entry is PT_PHDR which describes the program header + // itself. + if (isMain) + addHdr(PT_PHDR, PF_R)->add(Out::programHeaders); + else + addHdr(PT_PHDR, PF_R)->add(part.programHeaders->getParent()); + + // PT_INTERP must be the second entry if exists. + if (OutputSection *cmd = findSection(".interp", partNo)) + addHdr(PT_INTERP, cmd->getPhdrFlags())->add(cmd); + + // Add the headers. We will remove them if they don't fit. + // In the other partitions the headers are ordinary sections, so they don't + // need to be added here. + if (isMain) { + load = addHdr(PT_LOAD, flags); + load->add(Out::elfHeader); + load->add(Out::programHeaders); + } } // PT_GNU_RELRO includes all sections that should be marked as Index: test/ELF/magic-page-combo-warn.s =================================================================== --- test/ELF/magic-page-combo-warn.s +++ test/ELF/magic-page-combo-warn.s @@ -13,7 +13,7 @@ # OMAGIC: ProgramHeader { # OMAGIC: Type: PT_LOAD -# OMAGIC-NEXT: Offset: 0xE8 +# OMAGIC-NEXT: Offset: 0xB0 # OMAGIC-NEXT: VirtualAddress: # OMAGIC-NEXT: PhysicalAddress: # OMAGIC-NEXT: FileSize: @@ -23,7 +23,7 @@ # OMAGIC-NEXT: PF_W # OMAGIC-NEXT: PF_X # OMAGIC-NEXT: ] -# OMAGIC-NEXT: Alignment: 8 +# OMAGIC-NEXT: Alignment: 4 # OMAGIC-NEXT: } # OMAGIC-NEXT: ProgramHeader { # OMAGIC-NEXT: Type: PT_GNU_STACK @@ -35,7 +35,7 @@ # NMAGIC: ProgramHeader { # NMAGIC-NEXT: Type: PT_LOAD -# NMAGIC-NEXT: Offset: 0x158 +# NMAGIC-NEXT: Offset: 0x120 # NMAGIC-NEXT: VirtualAddress: # NMAGIC-NEXT: PhysicalAddress: # NMAGIC-NEXT: FileSize: 1 @@ -43,11 +43,11 @@ # NMAGIC-NEXT: Flags [ # NMAGIC-NEXT: PF_R # NMAGIC-NEXT: ] -# NMAGIC-NEXT: Alignment: 8 +# NMAGIC-NEXT: Alignment: 1 # NMAGIC-NEXT: } # NMAGIC-NEXT: ProgramHeader { # NMAGIC-NEXT: Type: PT_LOAD -# NMAGIC-NEXT: Offset: 0x15C +# NMAGIC-NEXT: Offset: 0x124 # NMAGIC-NEXT: VirtualAddress: # NMAGIC-NEXT: PhysicalAddress: # NMAGIC-NEXT: FileSize: 2 @@ -60,7 +60,7 @@ # NMAGIC-NEXT: } # NMAGIC-NEXT: ProgramHeader { # NMAGIC-NEXT: Type: PT_LOAD (0x1) -# NMAGIC-NEXT: Offset: 0x15E +# NMAGIC-NEXT: Offset: 0x126 # NMAGIC-NEXT: VirtualAddress: # NMAGIC-NEXT: PhysicalAddress: # NMAGIC-NEXT: FileSize: 1 Index: test/ELF/nmagic.s =================================================================== --- test/ELF/nmagic.s +++ test/ELF/nmagic.s @@ -6,12 +6,12 @@ # RUN: llvm-readelf --section-headers %t.exe | FileCheck %s # CHECK: [ 0] NULL 00000000 000000 000000 00 0 0 0 -# CHECK: [ 1] .text PROGBITS 00000000 0000d4 000001 00 AX 0 0 4 -# CHECK: [ 2] .rodata PROGBITS 00000008 0000d8 000008 00 A 0 0 8 -# CHECK: [ 3] .comment PROGBITS 00000000 0000e0 000008 01 MS 0 0 1 -# CHECK: [ 4] .symtab SYMTAB 00000000 0000e8 000020 10 6 1 4 -# CHECK: [ 5] .shstrtab STRTAB 00000000 000108 000032 00 0 0 1 -# CHECK: [ 6] .strtab STRTAB 00000000 00013a 000008 00 0 0 1 +# CHECK: [ 1] .text PROGBITS 00000000 000094 000001 00 AX 0 0 4 +# CHECK: [ 2] .rodata PROGBITS 00000008 000098 000008 00 A 0 0 8 +# CHECK: [ 3] .comment PROGBITS 00000000 0000a0 000008 01 MS 0 0 1 +# CHECK: [ 4] .symtab SYMTAB 00000000 0000a8 000020 10 6 1 4 +# CHECK: [ 5] .shstrtab STRTAB 00000000 0000c8 000032 00 0 0 1 +# CHECK: [ 6] .strtab STRTAB 00000000 0000fa 000008 00 0 0 1 .globl _start .text Index: test/ELF/relro-omagic.s =================================================================== --- test/ELF/relro-omagic.s +++ test/ELF/relro-omagic.s @@ -9,18 +9,18 @@ # NORELRO: Sections: # NORELRO-NEXT: Idx Name Size VMA Type # NORELRO-NEXT: 0 00000000 0000000000000000 -# NORELRO-NEXT: 1 .dynsym 00000048 0000000000200120 -# NORELRO-NEXT: 2 .hash 00000020 0000000000200168 -# NORELRO-NEXT: 3 .dynstr 00000021 0000000000200188 -# NORELRO-NEXT: 4 .rela.dyn 00000018 00000000002001b0 -# NORELRO-NEXT: 5 .rela.plt 00000018 00000000002001c8 -# NORELRO-NEXT: 6 .text 0000000a 00000000002001e0 TEXT -# NORELRO-NEXT: 7 .plt 00000020 00000000002001f0 TEXT -# NORELRO-NEXT: 8 .data 00000008 0000000000200210 DATA -# NORELRO-NEXT: 9 .foo 00000004 0000000000200218 DATA -# NORELRO-NEXT: 10 .dynamic 000000f0 0000000000200220 -# NORELRO-NEXT: 11 .got 00000008 0000000000200310 DATA -# NORELRO-NEXT: 12 .got.plt 00000020 0000000000200318 DATA +# NORELRO-NEXT: 1 .dynsym 00000048 00000000002000e8 +# NORELRO-NEXT: 2 .hash 00000020 0000000000200130 +# NORELRO-NEXT: 3 .dynstr 00000021 0000000000200150 +# NORELRO-NEXT: 4 .rela.dyn 00000018 0000000000200178 +# NORELRO-NEXT: 5 .rela.plt 00000018 0000000000200190 +# NORELRO-NEXT: 6 .text 0000000a 00000000002001a8 TEXT +# NORELRO-NEXT: 7 .plt 00000020 00000000002001c0 TEXT +# NORELRO-NEXT: 8 .data 00000008 00000000002001e0 DATA +# NORELRO-NEXT: 9 .foo 00000004 00000000002001e8 DATA +# NORELRO-NEXT: 10 .dynamic 000000f0 00000000002001f0 +# NORELRO-NEXT: 11 .got 00000008 00000000002002e0 DATA +# NORELRO-NEXT: 12 .got.plt 00000020 00000000002002e8 DATA # NOPHDRS: ProgramHeaders [ # NOPHDRS-NOT: PT_GNU_RELRO Index: test/ELF/segments.s =================================================================== --- test/ELF/segments.s +++ test/ELF/segments.s @@ -84,7 +84,7 @@ # OMAGIC: ProgramHeader { # OMAGIC: Type: PT_LOAD -# OMAGIC-NEXT: Offset: 0xE8 +# OMAGIC-NEXT: Offset: 0xB0 # OMAGIC-NEXT: VirtualAddress: # OMAGIC-NEXT: PhysicalAddress: # OMAGIC-NEXT: FileSize: @@ -94,7 +94,7 @@ # OMAGIC-NEXT: PF_W # OMAGIC-NEXT: PF_X # OMAGIC-NEXT: ] -# OMAGIC-NEXT: Alignment: 8 +# OMAGIC-NEXT: Alignment: 4 # OMAGIC-NEXT: } # OMAGIC-NEXT: ProgramHeader { # OMAGIC-NEXT: Type: PT_GNU_STACK @@ -106,7 +106,7 @@ # NMAGIC: ProgramHeader { # NMAGIC-NEXT: Type: PT_LOAD -# NMAGIC-NEXT: Offset: 0x158 +# NMAGIC-NEXT: Offset: 0x120 # NMAGIC-NEXT: VirtualAddress: # NMAGIC-NEXT: PhysicalAddress: # NMAGIC-NEXT: FileSize: 1 @@ -114,11 +114,11 @@ # NMAGIC-NEXT: Flags [ # NMAGIC-NEXT: PF_R # NMAGIC-NEXT: ] -# NMAGIC-NEXT: Alignment: 8 +# NMAGIC-NEXT: Alignment: 1 # NMAGIC-NEXT: } # NMAGIC-NEXT: ProgramHeader { # NMAGIC-NEXT: Type: PT_LOAD -# NMAGIC-NEXT: Offset: 0x15C +# NMAGIC-NEXT: Offset: 0x124 # NMAGIC-NEXT: VirtualAddress: # NMAGIC-NEXT: PhysicalAddress: # NMAGIC-NEXT: FileSize: 2 @@ -131,7 +131,7 @@ # NMAGIC-NEXT: } # NMAGIC-NEXT: ProgramHeader { # NMAGIC-NEXT: Type: PT_LOAD (0x1) -# NMAGIC-NEXT: Offset: 0x15E +# NMAGIC-NEXT: Offset: 0x126 # NMAGIC-NEXT: VirtualAddress: # NMAGIC-NEXT: PhysicalAddress: # NMAGIC-NEXT: FileSize: 1