mirror of
https://github.com/intel/llvm.git
synced 2026-01-18 16:50:51 +08:00
[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
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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: ]
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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: ]
|
||||
|
||||
@@ -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
|
||||
|
||||
35
lld/test/ELF/linkerscript/symbol-only-align.test
Normal file
35
lld/test/ELF/linkerscript/symbol-only-align.test
Normal file
@@ -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]]
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user