Skip to content

Commit 510a5c7

Browse files
committed
[ELF] Fix .gnu.version crash when .dynsym is discarded
Fix #88650 In addition, delete the unneeded comment. https://sourceware.org/gnu-gabi/program-loading-and-dynamic-linking.txt
1 parent e8cf413 commit 510a5c7

File tree

2 files changed

+28
-10
lines changed

2 files changed

+28
-10
lines changed

lld/ELF/SyntheticSections.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3798,9 +3798,8 @@ VersionTableSection::VersionTableSection(Ctx &ctx)
37983798
}
37993799

38003800
void VersionTableSection::finalizeContents() {
3801-
// At the moment of june 2016 GNU docs does not mention that sh_link field
3802-
// should be set, but Sun docs do. Also readelf relies on this field.
3803-
getParent()->link = getPartition(ctx).dynSymTab->getParent()->sectionIndex;
3801+
if (OutputSection *osec = getPartition(ctx).dynSymTab->getParent())
3802+
getParent()->link = osec->sectionIndex;
38043803
}
38053804

38063805
size_t VersionTableSection::getSize() const {
Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,43 @@
11
# REQUIRES: aarch64
22

33
## We allow discarding .dynsym, check we don't crash.
4-
# RUN: llvm-mc -filetype=obj -triple=aarch64 %s -o %t.o
4+
# RUN: rm -rf %t && split-file %s %t && cd %t
5+
# RUN: llvm-mc -filetype=obj -triple=aarch64 a.s -o a.o
6+
# RUN: llvm-mc -filetype=obj -triple=aarch64 c.s -o c.o
7+
# RUN: ld.lld -shared --version-script=c.ver c.o -o c.so
58

6-
# RUN: echo 'SECTIONS { /DISCARD/ : { *(.dynsym) } }' > %t.lds
7-
# RUN: ld.lld -shared -T %t.lds %t.o -o %t.so
8-
# RUN: llvm-readelf -r %t.so | FileCheck %s
9+
# RUN: echo 'SECTIONS { /DISCARD/ : { *(.dynsym) } }' > 1.lds
10+
# RUN: ld.lld -shared -T 1.lds a.o c.so -o out1.so
11+
# RUN: llvm-readelf -Sr out1.so | FileCheck %s --check-prefixes=CHECK,CHECK1
912

10-
# RUN: echo 'SECTIONS { /DISCARD/ : { *(.dynsym .dynstr) } }' > %t.lds
11-
# RUN: ld.lld -shared -T %t.lds %t.o -o %t.so
12-
# RUN: llvm-readelf -r %t.so | FileCheck %s
13+
# RUN: echo 'SECTIONS { /DISCARD/ : { *(.dynsym .dynstr) } }' > 2.lds
14+
# RUN: ld.lld -shared -T 2.lds a.o c.so -o out2.so
15+
# RUN: llvm-readelf -Sr out2.so | FileCheck %s --check-prefixes=CHECK,CHECK2
16+
17+
# CHECK: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
18+
# CHECK-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 0
19+
# CHECK-NEXT: [ 1] .gnu.version VERSYM 0000000000000000 {{.*}} 000006 02 A 0 0 2
20+
# CHECK1-NEXT: [ 2] .gnu.version_r VERNEED 0000000000000008 {{.*}} 000020 00 A 5 1 4
21+
# CHECK2-NEXT: [ 2] .gnu.version_r VERNEED 0000000000000008 {{.*}} 000020 00 A 0 1 4
22+
# CHECK1: [ 5] .dynstr STRTAB
1323

1424
# CHECK: contains 2 entries:
1525
# CHECK: R_AARCH64_RELATIVE [[#]]
1626
# CHECK-NEXT: R_AARCH64_GLOB_DAT 0{{$}}
1727

28+
#--- a.s
1829
adrp x9, :got:var
1930
ldr x9, [x9, :got_lo12:var]
31+
bl __libc_start_main
2032

2133
.data
2234
.align 8
2335
foo:
2436
.quad foo
37+
38+
#--- c.s
39+
.globl __libc_start_main
40+
__libc_start_main:
41+
42+
#--- c.ver
43+
GLIBC_2.34 { __libc_start_main; };

0 commit comments

Comments
 (0)