Skip to content

Commit 1db59dc

Browse files
committed
[ELF] Fix llvm_unreachable failure when COMMON is placed in SHT_PROGBITS output section
Fix a regression in aa27bab: COMMON in an SHT_PROGBITS output section caused llvm_unreachable failure.
1 parent cd331af commit 1db59dc

File tree

2 files changed

+37
-42
lines changed

2 files changed

+37
-42
lines changed

lld/ELF/SyntheticSections.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -186,9 +186,7 @@ class BuildIdSection : public SyntheticSection {
186186
class BssSection final : public SyntheticSection {
187187
public:
188188
BssSection(StringRef name, uint64_t size, uint32_t alignment);
189-
void writeTo(uint8_t *) override {
190-
llvm_unreachable("unexpected writeTo() call for SHT_NOBITS section");
191-
}
189+
void writeTo(uint8_t *) override {}
192190
bool isNeeded() const override { return size != 0; }
193191
size_t getSize() const override { return size; }
194192

lld/test/ELF/linkerscript/common.s

Lines changed: 36 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,44 @@
11
# REQUIRES: x86
2-
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
3-
# RUN: echo "SECTIONS { . = SIZEOF_HEADERS; .common : { *(COMMON) } }" > %t.script
4-
# RUN: ld.lld -o %t1 --script %t.script %t
5-
# RUN: llvm-readobj -S --symbols %t1 | FileCheck %s
6-
7-
# CHECK: Section {
8-
# CHECK: Index:
9-
# CHECK: Name: .common
10-
# CHECK-NEXT: Type: SHT_NOBITS
11-
# CHECK-NEXT: Flags [
12-
# CHECK-NEXT: SHF_ALLOC
13-
# CHECK-NEXT: SHF_WRITE
14-
# CHECK-NEXT: ]
15-
# CHECK-NEXT: Address: 0x200
16-
# CHECK-NEXT: Offset: 0x
17-
# CHECK-NEXT: Size: 384
18-
# CHECK-NEXT: Link: 0
19-
# CHECK-NEXT: Info: 0
20-
# CHECK-NEXT: AddressAlignment: 256
21-
# CHECK-NEXT: EntrySize: 0
22-
# CHECK-NEXT: }
23-
# CHECK: Symbol {
24-
# CHECK: Name: q1
25-
# CHECK-NEXT: Value: 0x200
26-
# CHECK-NEXT: Size: 128
27-
# CHECK-NEXT: Binding: Global
28-
# CHECK-NEXT: Type: Object
29-
# CHECK-NEXT: Other: 0
30-
# CHECK-NEXT: Section: .common
31-
# CHECK-NEXT: }
32-
# CHECK-NEXT: Symbol {
33-
# CHECK-NEXT: Name: q2
34-
# CHECK-NEXT: Value: 0x300
35-
# CHECK-NEXT: Size: 128
36-
# CHECK-NEXT: Binding: Global
37-
# CHECK-NEXT: Type: Object
38-
# CHECK-NEXT: Other: 0
39-
# CHECK-NEXT: Section: .common
40-
# CHECK-NEXT: }
2+
## Test that COMMON matches common symbols.
413

4+
# RUN: rm -rf %t && split-file %s %t
5+
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %t/a.s -o %t/a.o
6+
# RUN: ld.lld -T %t/1.t %t/a.o -o %t/a1
7+
# RUN: llvm-readelf -S -s %t/a1 | FileCheck %s --check-prefix=CHECK1
8+
# RUN: ld.lld -T %t/2.t %t/a.o -o %t/a2
9+
# RUN: llvm-readelf -S -s %t/a2 | FileCheck %s --check-prefix=CHECK2
10+
11+
# CHECK1: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
12+
# CHECK1-NEXT: [ 0] NULL [[#%x,]] [[#%x,]] 000000 00 0 0 0
13+
# CHECK1-NEXT: [ 1] .text PROGBITS [[#%x,]] [[#%x,]] 000005 00 AX 0 0 4
14+
# CHECK1-NEXT: [ 2] .data PROGBITS [[#%x,]] [[#%x,]] 000001 00 WA 0 0 1
15+
# CHECK1-NEXT: [ 3] .common NOBITS [[#%x,]] [[#%x,]] 000180 00 WA 0 0 256
16+
# CHECK1: Value Size Type Bind Vis Ndx Name
17+
# CHECK1-DAG: [[#%x,]] 128 OBJECT GLOBAL DEFAULT [[#]] q1
18+
# CHECK1-DAG: [[#%x,]] 128 OBJECT GLOBAL DEFAULT [[#]] q2
19+
20+
# CHECK2: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
21+
# CHECK2-NEXT: [ 0] NULL [[#%x,]] [[#%x,]] 000000 00 0 0 0
22+
# CHECK2-NEXT: [ 1] .text PROGBITS [[#%x,]] [[#%x,]] 000005 00 AX 0 0 4
23+
# CHECK2-NEXT: [ 2] .data PROGBITS [[#%x,]] [[#%x,]] 000180 00 WA 0 0 256
24+
# CHECK2: Value Size Type Bind Vis Ndx Name
25+
# CHECK2-DAG: [[#%x,]] 128 OBJECT GLOBAL DEFAULT [[#]] q1
26+
# CHECK2-DAG: [[#%x,]] 128 OBJECT GLOBAL DEFAULT [[#]] q2
27+
28+
#--- a.s
4229
.globl _start
4330
_start:
4431
jmp _start
4532

33+
.section .data,"aw",@progbits
34+
.byte 0
35+
4636
.comm q1,128,8
4737
.comm q2,128,256
38+
39+
#--- 1.t
40+
SECTIONS { . = SIZEOF_HEADERS; .common : { *(COMMON) } }
41+
42+
#--- 2.t
43+
## COMMON can be placed in a SHT_PROGBITS section.
44+
SECTIONS { . = SIZEOF_HEADERS; .data : { *(.data) *(COMMON) } }

0 commit comments

Comments
 (0)