Index: ELF/LinkerScript.h =================================================================== --- ELF/LinkerScript.h +++ ELF/LinkerScript.h @@ -55,6 +55,8 @@ template bool shouldKeep(InputSectionBase *S); int compareSections(StringRef A, StringRef B); + bool Exist = false; + private: template SectionRule *find(InputSectionBase *S); Index: ELF/LinkerScript.cpp =================================================================== --- ELF/LinkerScript.cpp +++ ELF/LinkerScript.cpp @@ -470,6 +470,7 @@ void LinkerScript::read(MemoryBufferRef MB) { StringRef Path = MB.getBufferIdentifier(); ScriptParser(&Alloc, MB.getBuffer(), isUnderSysroot(Path)).run(); + Exist = true; } template StringRef LinkerScript::getOutputSection(InputSectionBase *); Index: ELF/Writer.cpp =================================================================== --- ELF/Writer.cpp +++ ELF/Writer.cpp @@ -1266,10 +1266,16 @@ continue; // If flags changed then we want new load segment. + // If we have linker script then we don't do that, because + // it is script writer responsibility to assign VA's. uintX_t NewFlags = toPhdrFlags(Sec->getFlags()); if (Flags != NewFlags) { - Load = AddHdr(PT_LOAD, NewFlags); - Flags = NewFlags; + if (Script->Exist) { + Load->H.p_flags |= NewFlags; + } else { + Load = AddHdr(PT_LOAD, NewFlags); + Flags = NewFlags; + } } AddSec(*Load, Sec); Index: test/ELF/end.s =================================================================== --- test/ELF/end.s +++ test/ELF/end.s @@ -36,13 +36,13 @@ // NOBSS-NEXT: SHF_ALLOC // NOBSS-NEXT: SHF_WRITE // NOBSS-NEXT: ] -// NOBSS-NEXT: Address: 0x12000 +// NOBSS-NEXT: Address: 0x100E9 // NOBSS-NEXT: Offset: // NOBSS-NEXT: Size: 2 // NOBSS: ] // NOBSS: Symbols [ // NOBSS: Name: _end -// NOBSS-NEXT: Value: 0x12002 +// NOBSS-NEXT: Value: 0x100EB // NOBSS: ] // If the layout of the sections is changed, "_end" should point to the end of allocated address space. @@ -60,13 +60,13 @@ // TEXTATEND-NEXT: SHF_ALLOC // TEXTATEND-NEXT: SHF_EXECINSTR // TEXTATEND-NEXT: ] -// TEXTATEND-NEXT: Address: 0x12000 +// TEXTATEND-NEXT: Address: 0x100F0 // TEXTATEND-NEXT: Offset: // TEXTATEND-NEXT: Size: 1 // TEXTATEND: ] // TEXTATEND: Symbols [ // TEXTATEND: Name: _end -// TEXTATEND-NEXT: Value: 0x12001 +// TEXTATEND-NEXT: Value: 0x100F1 // TEXTATEND: ] .global _start,_end Index: test/ELF/linkerscript-oneload.s =================================================================== --- test/ELF/linkerscript-oneload.s +++ test/ELF/linkerscript-oneload.s @@ -0,0 +1,52 @@ +# REQUIRES: x86 + +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t +# RUN: echo "" > %t.script +# RUN: ld.lld %t --script %t.script -o %t2 +# RUN: llvm-readobj -program-headers -symbols %t2 | FileCheck %s + +.globl _start; +_start: + nop + +## Check that only one PT_LOAD is created with empty linker script. +# CHECK: ProgramHeaders [ +# CHECK-NEXT: ProgramHeader { +# CHECK-NEXT: Type: PT_PHDR +# CHECK-NEXT: Offset: 0x40 +# CHECK-NEXT: VirtualAddress: 0x10040 +# CHECK-NEXT: PhysicalAddress: 0x10040 +# CHECK-NEXT: FileSize: 168 +# CHECK-NEXT: MemSize: 168 +# CHECK-NEXT: Flags [ +# CHECK-NEXT: PF_R +# CHECK-NEXT: ] +# CHECK-NEXT: Alignment: 8 +# CHECK-NEXT: } +# CHECK-NEXT: ProgramHeader { +# CHECK-NEXT: Type: PT_LOAD +# CHECK-NEXT: Offset: 0x0 +# CHECK-NEXT: VirtualAddress: 0x10000 +# CHECK-NEXT: PhysicalAddress: 0x10000 +# CHECK-NEXT: FileSize: 233 +# CHECK-NEXT: MemSize: 233 +# CHECK-NEXT: Flags [ +# CHECK-NEXT: PF_R +# CHECK-NEXT: PF_X +# CHECK-NEXT: ] +# CHECK-NEXT: Alignment: 4096 +# CHECK-NEXT: } +# CHECK-NEXT: ProgramHeader { +# CHECK-NEXT: Type: PT_GNU_STACK +# CHECK-NEXT: Offset: 0x0 +# CHECK-NEXT: VirtualAddress: 0x0 +# CHECK-NEXT: PhysicalAddress: 0x0 +# CHECK-NEXT: FileSize: 0 +# CHECK-NEXT: MemSize: 0 +# CHECK-NEXT: Flags [ +# CHECK-NEXT: PF_R +# CHECK-NEXT: PF_W +# CHECK-NEXT: ] +# CHECK-NEXT: Alignment: 0 +# CHECK-NEXT: } +# CHECK-NEXT: ] Index: test/ELF/linkerscript-sections-keep.s =================================================================== --- test/ELF/linkerscript-sections-keep.s +++ test/ELF/linkerscript-sections-keep.s @@ -12,8 +12,8 @@ # SECGC: Sections: # SECGC-NEXT: Idx Name Size Address Type # SECGC-NEXT: 0 00000000 0000000000000000 -# SECGC-NEXT: 1 .text 00000007 0000000000011000 TEXT DATA -# SECGC-NEXT: 2 .temp 00000004 0000000000012000 DATA +# SECGC-NEXT: 1 .text 00000007 00000000000100e8 TEXT DATA +# SECGC-NEXT: 2 .temp 00000004 00000000000100ef DATA ## Now apply KEEP command to preserve the section. # RUN: echo "SECTIONS { \ @@ -26,9 +26,9 @@ # SECNOGC: Sections: # SECNOGC-NEXT: Idx Name Size Address Type # SECNOGC-NEXT: 0 00000000 0000000000000000 -# SECNOGC-NEXT: 1 .text 00000007 0000000000011000 TEXT DATA -# SECNOGC-NEXT: 2 .keep 00000004 0000000000012000 DATA -# SECNOGC-NEXT: 3 .temp 00000004 0000000000012004 DATA +# SECNOGC-NEXT: 1 .text 00000007 00000000000100e8 TEXT DATA +# SECNOGC-NEXT: 2 .keep 00000004 00000000000100ef DATA +# SECNOGC-NEXT: 3 .temp 00000004 00000000000100f3 DATA ## A section name matches two entries in the SECTIONS directive. The ## first one doesn't have KEEP, the second one does. If section that have @@ -42,9 +42,9 @@ # KEEP-AT-FIRST: Sections: # KEEP-AT-FIRST-NEXT: Idx Name Size Address Type # KEEP-AT-FIRST-NEXT: 0 00000000 0000000000000000 -# KEEP-AT-FIRST-NEXT: 1 .keep 00000004 0000000000010120 DATA -# KEEP-AT-FIRST-NEXT: 2 .temp 00000004 0000000000010124 DATA -# KEEP-AT-FIRST-NEXT: 3 .text 00000007 0000000000011000 TEXT DATA +# KEEP-AT-FIRST-NEXT: 1 .keep 00000004 00000000000100e8 DATA +# KEEP-AT-FIRST-NEXT: 2 .temp 00000004 00000000000100ec DATA +# KEEP-AT-FIRST-NEXT: 3 .text 00000007 00000000000100f0 TEXT DATA # KEEP-AT-FIRST-NEXT: 4 .symtab 00000060 0000000000000000 # KEEP-AT-FIRST-NEXT: 5 .shstrtab 0000002d 0000000000000000 # KEEP-AT-FIRST-NEXT: 6 .strtab 00000012 0000000000000000 @@ -63,8 +63,8 @@ # KEEP-AT-SECOND: Sections: # KEEP-AT-SECOND-NEXT: Idx Name Size Address Type # KEEP-AT-SECOND-NEXT: 0 00000000 0000000000000000 -# KEEP-AT-SECOND-NEXT: 1 .temp 00000004 0000000000010120 DATA -# KEEP-AT-SECOND-NEXT: 2 .text 00000007 0000000000011000 TEXT DATA +# KEEP-AT-SECOND-NEXT: 1 .temp 00000004 00000000000100e8 DATA +# KEEP-AT-SECOND-NEXT: 2 .text 00000007 00000000000100ec TEXT DATA # KEEP-AT-SECOND-NEXT: 3 .symtab 00000048 0000000000000000 # KEEP-AT-SECOND-NEXT: 4 .shstrtab 00000027 0000000000000000 # KEEP-AT-SECOND-NEXT: 5 .strtab 0000000d 0000000000000000 Index: test/ELF/linkerscript-sections-padding.s =================================================================== --- test/ELF/linkerscript-sections-padding.s +++ test/ELF/linkerscript-sections-padding.s @@ -5,19 +5,19 @@ # RUN: echo "SECTIONS { .mysec : { *(.mysec*) } =0x112233445566778899 }" > %t.script # RUN: ld.lld -o %t.out --script %t.script %t # RUN: hexdump -C %t.out | FileCheck -check-prefix=YES %s -# YES: 00000120 66 22 33 44 55 66 77 88 99 11 22 33 44 55 66 77 +# YES: 000000f0 66 22 33 44 55 66 77 88 99 11 22 33 44 55 66 77 ## Confirming that address was correct: # RUN: echo "SECTIONS { .mysec : { *(.mysec*) } =0x998877665544332211 }" > %t.script # RUN: ld.lld -o %t.out --script %t.script %t # RUN: hexdump -C %t.out | FileCheck -check-prefix=YES2 %s -# YES2: 00000120 66 88 77 66 55 44 33 22 11 99 88 77 66 55 44 +# YES2: 000000f0 66 88 77 66 55 44 33 22 11 99 88 77 66 55 44 ## Default padding value is 0x00: # RUN: echo "SECTIONS { .mysec : { *(.mysec*) } }" > %t.script # RUN: ld.lld -o %t.out --script %t.script %t # RUN: hexdump -C %t.out | FileCheck -check-prefix=NO %s -# NO: 00000120 66 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +# NO: 000000f0 66 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ## Filler should be a hex value (1): # RUN: echo "SECTIONS { .mysec : { *(.mysec*) } =99 }" > %t.script Index: test/ELF/wildcards.s =================================================================== --- test/ELF/wildcards.s +++ test/ELF/wildcards.s @@ -10,13 +10,13 @@ # SEC-DEFAULT: Sections: # SEC-DEFAULT-NEXT: Idx Name Size Address Type # SEC-DEFAULT-NEXT: 0 00000000 0000000000000000 -# SEC-DEFAULT-NEXT: 1 .text 00000008 0000000000011000 TEXT DATA -# SEC-DEFAULT-NEXT: 2 .abcd 00000004 0000000000011008 TEXT DATA -# SEC-DEFAULT-NEXT: 3 .ad 00000004 000000000001100c TEXT DATA -# SEC-DEFAULT-NEXT: 4 .ag 00000004 0000000000011010 TEXT DATA -# SEC-DEFAULT-NEXT: 5 .symtab 00000030 0000000000000000 -# SEC-DEFAULT-NEXT: 6 .shstrtab 0000002f 0000000000000000 -# SEC-DEFAULT-NEXT: 7 .strtab 00000008 0000000000000000 +# SEC-DEFAULT-NEXT: 1 .text 00000008 00000000000100e8 TEXT DATA +# SEC-DEFAULT-NEXT: 2 .abcd 00000004 00000000000100f0 TEXT DATA +# SEC-DEFAULT-NEXT: 3 .ad 00000004 00000000000100f4 TEXT DATA +# SEC-DEFAULT-NEXT: 4 .ag 00000004 00000000000100f8 TEXT DATA +# SEC-DEFAULT-NEXT: 5 .symtab 00000030 0000000000000000 +# SEC-DEFAULT-NEXT: 6 .shstrtab 0000002f 0000000000000000 +# SEC-DEFAULT-NEXT: 7 .strtab 00000008 0000000000000000 ## Now replace the symbol with '?' and check that results are the same. # RUN: echo "SECTIONS { \ @@ -34,12 +34,12 @@ # SEC-ALL: Sections: # SEC-ALL-NEXT: Idx Name Size Address Type # SEC-ALL-NEXT: 0 00000000 0000000000000000 -# SEC-ALL-NEXT: 1 .text 0000000c 0000000000011000 TEXT DATA -# SEC-ALL-NEXT: 2 .ad 00000004 000000000001100c TEXT DATA -# SEC-ALL-NEXT: 3 .ag 00000004 0000000000011010 TEXT DATA -# SEC-ALL-NEXT: 4 .symtab 00000030 0000000000000000 -# SEC-ALL-NEXT: 5 .shstrtab 00000029 0000000000000000 -# SEC-ALL-NEXT: 6 .strtab 00000008 0000000000000000 +# SEC-ALL-NEXT: 1 .text 0000000c 00000000000100e8 TEXT DATA +# SEC-ALL-NEXT: 2 .ad 00000004 00000000000100f4 TEXT DATA +# SEC-ALL-NEXT: 3 .ag 00000004 00000000000100f8 TEXT DATA +# SEC-ALL-NEXT: 4 .symtab 00000030 0000000000000000 +# SEC-ALL-NEXT: 5 .shstrtab 00000029 0000000000000000 +# SEC-ALL-NEXT: 6 .strtab 00000008 0000000000000000 ## All sections started with .a are merged. # RUN: echo "SECTIONS { \ @@ -49,11 +49,11 @@ # RUN: FileCheck -check-prefix=SEC-NO %s # SEC-NO: Sections: # SEC-NO-NEXT: Idx Name Size Address Type -# SEC-NO-NEXT: 0 00000000 0000000000000000 -# SEC-NO-NEXT: 1 .text 00000014 0000000000011000 TEXT DATA -# SEC-NO-NEXT: 2 .symtab 00000030 0000000000000000 -# SEC-NO-NEXT: 3 .shstrtab 00000021 0000000000000000 -# SEC-NO-NEXT: 4 .strtab 00000008 0000000000000000 +# SEC-NO-NEXT: 0 00000000 0000000000000000 +# SEC-NO-NEXT: 1 .text 00000014 00000000000100e8 TEXT DATA +# SEC-NO-NEXT: 2 .symtab 00000030 0000000000000000 +# SEC-NO-NEXT: 3 .shstrtab 00000021 0000000000000000 +# SEC-NO-NEXT: 4 .strtab 00000008 0000000000000000 .text .section .abc,"ax",@progbits