From ccba42c7eb3cdfe7824cd4b473a9688e5738fa3a Mon Sep 17 00:00:00 2001 From: Andrew Ng Date: Tue, 23 Apr 2019 12:38:52 +0000 Subject: [PATCH] [ELF] Change default output section type to SHT_PROGBITS This fixes an issue where a symbol only section at the start of a PT_LOAD segment, causes incorrect alignment of the file offset for the start of the segment which results in the output of an invalid ELF. SHT_PROGBITS was the default output section type in the past. Differential Revision: https://reviews.llvm.org/D60131 llvm-svn: 358981 --- lld/ELF/LinkerScript.cpp | 2 +- .../ELF/linkerscript/arm-exidx-order.test | 2 +- .../ELF/linkerscript/extend-pt-load2.test | 4 +-- lld/test/ELF/linkerscript/merge-sections.s | 2 +- lld/test/ELF/linkerscript/orphan-phdrs.s | 8 ++--- .../ELF/linkerscript/symbol-only-align.test | 35 +++++++++++++++++++ .../ELF/linkerscript/symbol-only-flags.test | 2 +- 7 files changed, 45 insertions(+), 10 deletions(-) create mode 100644 lld/test/ELF/linkerscript/symbol-only-align.test diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index d6e7a28cdca83..006b962c624f4 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -86,7 +86,7 @@ OutputSection *LinkerScript::createOutputSection(StringRef Name, // There was a forward reference. Sec = SecRef; } else { - Sec = make(Name, SHT_NOBITS, 0); + Sec = make(Name, SHT_PROGBITS, 0); if (!SecRef) SecRef = Sec; } diff --git a/lld/test/ELF/linkerscript/arm-exidx-order.test b/lld/test/ELF/linkerscript/arm-exidx-order.test index 60abddfd77da0..a6050e89b8975 100644 --- a/lld/test/ELF/linkerscript/arm-exidx-order.test +++ b/lld/test/ELF/linkerscript/arm-exidx-order.test @@ -13,7 +13,7 @@ SECTIONS { # CHECK: Section { # CHECK: Index: # CHECK: Name: .foo -# CHECK-NEXT: Type: SHT_NOBITS +# CHECK-NEXT: Type: SHT_PROGBITS # CHECK-NEXT: Flags [ # CHECK-NEXT: SHF_ALLOC # CHECK-NEXT: ] diff --git a/lld/test/ELF/linkerscript/extend-pt-load2.test b/lld/test/ELF/linkerscript/extend-pt-load2.test index 1aa943703f27c..c8a4e1bb3d3e6 100644 --- a/lld/test/ELF/linkerscript/extend-pt-load2.test +++ b/lld/test/ELF/linkerscript/extend-pt-load2.test @@ -17,8 +17,8 @@ SECTIONS { } # CHECK: .text PROGBITS 00000000000001bc 0001bc 000001 00 AX -# CHECK-NEXT: bar NOBITS 00000000000001bd 0001bd 000e43 00 AX +# CHECK-NEXT: bar PROGBITS 00000000000001bd 0001bd 000e43 00 AX # CHECK-NEXT: .data.rel.ro PROGBITS 0000000000001000 001000 000001 00 WA -# CHECK: LOAD 0x000000 0x0000000000000000 0x0000000000000000 0x0001bd 0x001000 R E +# CHECK: LOAD 0x000000 0x0000000000000000 0x0000000000000000 0x001000 0x001000 R E # CHECK-NEXT: LOAD 0x001000 0x0000000000001000 0x0000000000001000 0x000068 0x000068 RW diff --git a/lld/test/ELF/linkerscript/merge-sections.s b/lld/test/ELF/linkerscript/merge-sections.s index 8fb9e87d616a4..ff85fec7ba585 100644 --- a/lld/test/ELF/linkerscript/merge-sections.s +++ b/lld/test/ELF/linkerscript/merge-sections.s @@ -35,7 +35,7 @@ # RUN: llvm-readobj -s -t %t2 | FileCheck %s --check-prefix=GC # GC: Name: .foo -# GC-NEXT: Type: SHT_NOBITS +# GC-NEXT: Type: SHT_PROGBITS # GC-NEXT: Flags [ # GC-NEXT: SHF_ALLOC # GC-NEXT: ] diff --git a/lld/test/ELF/linkerscript/orphan-phdrs.s b/lld/test/ELF/linkerscript/orphan-phdrs.s index c889562d0fcc4..8bfa24b0d033c 100644 --- a/lld/test/ELF/linkerscript/orphan-phdrs.s +++ b/lld/test/ELF/linkerscript/orphan-phdrs.s @@ -23,13 +23,13 @@ # CHECK: Segment Sections # CHECK-NEXT: .text .orphan -# CHECK-NEXT: .rw +# CHECK-NEXT: .empty .rw -.section .text, "ax" +.section .text,"ax" ret -.section .rw, "aw" +.section .rw,"aw" .quad 0 -.section .orphan, "ax" +.section .orphan,"ax" ret diff --git a/lld/test/ELF/linkerscript/symbol-only-align.test b/lld/test/ELF/linkerscript/symbol-only-align.test new file mode 100644 index 0000000000000..3d3b2ee519aa2 --- /dev/null +++ b/lld/test/ELF/linkerscript/symbol-only-align.test @@ -0,0 +1,35 @@ +# REQUIRES: x86 +# RUN: echo '.text; ret; .data; .quad 0' > %t.s +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %t.s -o %t.o +# RUN: ld.lld -o %t --script %s %t.o -shared +# RUN: llvm-readobj -elf-output-style=GNU -s -t -l %t | FileCheck %s + +PHDRS { + text PT_LOAD FLAGS(0x5); + data PT_LOAD FLAGS(0x6); +} + +SECTIONS { + . = SIZEOF_HEADERS; + .text : { *(.text) } : text + . = ALIGN(CONSTANT(MAXPAGESIZE)); + foo : { __start_foo = .; *(foo); __end_foo = .; } : data + .data : { *(.data) } + .dynamic : { *(.dynamic) } +} + +## Check that foo, the symbol only section, has the expected aligned address and +## file offset. Also check that the section's symbols and the data segment's +## offset and addresses match. + +# CHECK: Section Headers +# CHECK: foo PROGBITS 0000000000[[ADDR:[0-9a-f]*]] [[ADDR]] +# CHECK-NEXT: .data PROGBITS 0000000000[[ADDR]] [[ADDR]] + +# CHECK: Symbol table +# CHECK: 0000000000[[ADDR]] 0 NOTYPE GLOBAL DEFAULT {{[0-9]+}} __start_foo +# CHECK: 0000000000[[ADDR]] 0 NOTYPE GLOBAL DEFAULT {{[0-9]+}} __end_foo + +# CHECK: Program Headers +# CHECK: LOAD +# CHECK-NEXT: LOAD 0x[[ADDR]] 0x0000000000[[ADDR]] 0x0000000000[[ADDR]] diff --git a/lld/test/ELF/linkerscript/symbol-only-flags.test b/lld/test/ELF/linkerscript/symbol-only-flags.test index cea2539cd6ba7..db1c744672327 100644 --- a/lld/test/ELF/linkerscript/symbol-only-flags.test +++ b/lld/test/ELF/linkerscript/symbol-only-flags.test @@ -14,7 +14,7 @@ SECTIONS { # CHECK: Section { # CHECK: Index: # CHECK: Name: .foo -# CHECK-NEXT: Type: SHT_NOBITS +# CHECK-NEXT: Type: SHT_PROGBITS # CHECK-NEXT: Flags [ # CHECK-NEXT: SHF_ALLOC # CHECK-NEXT: SHF_WRITE