summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Ng <anng.sw@gmail.com>2019-04-23 12:38:52 +0000
committerAndrew Ng <anng.sw@gmail.com>2019-04-23 12:38:52 +0000
commitccba42c7eb3cdfe7824cd4b473a9688e5738fa3a (patch)
treebbcf5c9f1cda372d1845d8004e336997c2a0f2a3
parent2769d58628f948b55891a5b3c1073080415f6c17 (diff)
downloadbcm5719-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.cpp2
-rw-r--r--lld/test/ELF/linkerscript/arm-exidx-order.test2
-rw-r--r--lld/test/ELF/linkerscript/extend-pt-load2.test4
-rw-r--r--lld/test/ELF/linkerscript/merge-sections.s2
-rw-r--r--lld/test/ELF/linkerscript/orphan-phdrs.s8
-rw-r--r--lld/test/ELF/linkerscript/symbol-only-align.test35
-rw-r--r--lld/test/ELF/linkerscript/symbol-only-flags.test2
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
OpenPOWER on IntegriCloud