diff options
| author | Andrew Ng <anng.sw@gmail.com> | 2019-04-23 12:38:52 +0000 |
|---|---|---|
| committer | Andrew Ng <anng.sw@gmail.com> | 2019-04-23 12:38:52 +0000 |
| commit | ccba42c7eb3cdfe7824cd4b473a9688e5738fa3a (patch) | |
| tree | bbcf5c9f1cda372d1845d8004e336997c2a0f2a3 | |
| parent | 2769d58628f948b55891a5b3c1073080415f6c17 (diff) | |
| download | bcm5719-llvm-ccba42c7eb3cdfe7824cd4b473a9688e5738fa3a.tar.gz bcm5719-llvm-ccba42c7eb3cdfe7824cd4b473a9688e5738fa3a.zip | |
[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
| -rw-r--r-- | lld/ELF/LinkerScript.cpp | 2 | ||||
| -rw-r--r-- | lld/test/ELF/linkerscript/arm-exidx-order.test | 2 | ||||
| -rw-r--r-- | lld/test/ELF/linkerscript/extend-pt-load2.test | 4 | ||||
| -rw-r--r-- | lld/test/ELF/linkerscript/merge-sections.s | 2 | ||||
| -rw-r--r-- | lld/test/ELF/linkerscript/orphan-phdrs.s | 8 | ||||
| -rw-r--r-- | lld/test/ELF/linkerscript/symbol-only-align.test | 35 | ||||
| -rw-r--r-- | lld/test/ELF/linkerscript/symbol-only-flags.test | 2 |
7 files changed, 45 insertions, 10 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index d6e7a28cdca..006b962c624 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<OutputSection>(Name, SHT_NOBITS, 0); + Sec = make<OutputSection>(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 60abddfd77d..a6050e89b89 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 1aa943703f2..c8a4e1bb3d3 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 8fb9e87d616..ff85fec7ba5 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 c889562d0fc..8bfa24b0d03 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 00000000000..3d3b2ee519a --- /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 cea2539cd6b..db1c7446723 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 |

