summaryrefslogtreecommitdiffstats
path: root/recipes-devtools
diff options
context:
space:
mode:
authorKhem Raj <raj.khem@gmail.com>2022-09-13 00:26:21 -0700
committerKhem Raj <raj.khem@gmail.com>2022-09-13 14:07:34 -0700
commit786911cebb177d9c835e9e8bc358ed2b8011a722 (patch)
treedf8c00c09b8f6c02c938db5e7c466fdd4ef172d7 /recipes-devtools
parent0ad6be9324bc16716ecd0b7fbbcbfd1e4aa5fc2c (diff)
downloadmeta-clang-786911cebb177d9c835e9e8bc358ed2b8011a722.tar.gz
clang: Fix llvm-objdump crash on aarch64/musl
Signed-off-by: Khem Raj <raj.khem@gmail.com>
Diffstat (limited to 'recipes-devtools')
-rw-r--r--recipes-devtools/clang/clang/0001-llvm-objdump-Change-printSymbolVersionDependency-to-.patch157
-rw-r--r--recipes-devtools/clang/common.inc1
2 files changed, 158 insertions, 0 deletions
diff --git a/recipes-devtools/clang/clang/0001-llvm-objdump-Change-printSymbolVersionDependency-to-.patch b/recipes-devtools/clang/clang/0001-llvm-objdump-Change-printSymbolVersionDependency-to-.patch
new file mode 100644
index 0000000..6bcc951
--- /dev/null
+++ b/recipes-devtools/clang/clang/0001-llvm-objdump-Change-printSymbolVersionDependency-to-.patch
@@ -0,0 +1,157 @@
1From 1a4646b30f627ef92c1de6cd65f6d0cc87b0ef11 Mon Sep 17 00:00:00 2001
2From: Khem Raj <raj.khem@gmail.com>
3Date: Tue, 13 Sep 2022 00:24:10 -0700
4Subject: [PATCH] [llvm-objdump] Change printSymbolVersionDependency to use
5 ELFFile API
6
7When .gnu.version_r is empty (allowed by readelf but warned by objdump),
8llvm-objdump -p may decode the next section as .gnu.version_r and may crash due
9to out-of-bounds C string reference. ELFFile<ELFT>::getVersionDependencies
10handles 0-entry .gnu.version_r gracefully. Just use it.
11
12Fix https://github.com/llvm/llvm-project/issues/57707
13
14Upstream-Status: Submitted [https://reviews.llvm.org/D133751]
15Signed-off-by: Khem Raj <raj.khem@gmail.com>
16---
17 llvm/include/llvm/Object/ELF.h | 2 +-
18 .../llvm-objdump/ELF/verneed-invalid.test | 24 ++++++++++++
19 llvm/test/tools/llvm-objdump/ELF/verneed.test | 20 ++++++++++
20 llvm/tools/llvm-objdump/ELFDump.cpp | 39 ++++++++++---------
21 4 files changed, 65 insertions(+), 20 deletions(-)
22 create mode 100644 llvm/test/tools/llvm-objdump/ELF/verneed-invalid.test
23
24diff --git a/llvm/include/llvm/Object/ELF.h b/llvm/include/llvm/Object/ELF.h
25index 16c9a1461f8d..8b8a574be090 100644
26--- a/llvm/include/llvm/Object/ELF.h
27+++ b/llvm/include/llvm/Object/ELF.h
28@@ -1038,7 +1038,7 @@ ELFFile<ELFT>::getVersionDependencies(const Elf_Shdr &Sec,
29 VN.Offset = VerneedBuf - Start;
30
31 if (Verneed->vn_file < StrTab.size())
32- VN.File = std::string(StrTab.drop_front(Verneed->vn_file));
33+ VN.File = std::string(StrTab.data() + Verneed->vn_file);
34 else
35 VN.File = ("<corrupt vn_file: " + Twine(Verneed->vn_file) + ">").str();
36
37diff --git a/llvm/test/tools/llvm-objdump/ELF/verneed-invalid.test b/llvm/test/tools/llvm-objdump/ELF/verneed-invalid.test
38new file mode 100644
39index 000000000000..4756a59ed107
40--- /dev/null
41+++ b/llvm/test/tools/llvm-objdump/ELF/verneed-invalid.test
42@@ -0,0 +1,24 @@
43+# RUN: yaml2obj %s -o %t
44+# RUN: llvm-objdump -p %t 2>&1 | FileCheck %s --check-prefix=BROKEN-AUX -DFILE=%t
45+
46+# BROKEN-AUX: Version References:
47+# BROKEN-AUX-NEXT: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 2: found a misaligned auxiliary entry at offset 0x11
48+
49+--- !ELF
50+FileHeader:
51+ Class: ELFCLASS64
52+ Data: ELFDATA2LSB
53+ Type: ET_EXEC
54+Sections:
55+ - Name: .gnu.version
56+ Type: SHT_GNU_versym
57+ Flags: [ SHF_ALLOC ]
58+ Entries: [ 2 ]
59+ - Name: .gnu.version_r
60+ Type: SHT_GNU_verneed
61+ Flags: [ SHF_ALLOC ]
62+ Info: 1
63+ AddressAlign: 4
64+## The byte offset to the auxiliary entry is 0x11, i.e. it is not correctly aligned in memory.
65+ Content: "0100010001000000110000000000000000000000"
66+DynamicSymbols: []
67diff --git a/llvm/test/tools/llvm-objdump/ELF/verneed.test b/llvm/test/tools/llvm-objdump/ELF/verneed.test
68index 57e856e542ad..7b38ef95fd41 100644
69--- a/llvm/test/tools/llvm-objdump/ELF/verneed.test
70+++ b/llvm/test/tools/llvm-objdump/ELF/verneed.test
71@@ -46,3 +46,23 @@ Sections:
72 DynamicSymbols:
73 - Name: f1
74 Binding: STB_GLOBAL
75+
76+# RUN: yaml2obj --docnum=2 %s -o %t.empty
77+# RUN: llvm-objdump -p %t.empty 2>&1 | FileCheck %s --check-prefix=EMPTY --implicit-check-not=warning:
78+
79+# EMPTY: Version References:
80+# EMPTY-NOT: {{.}}
81+
82+--- !ELF
83+FileHeader:
84+ Class: ELFCLASS64
85+ Data: ELFDATA2LSB
86+ Type: ET_EXEC
87+ Machine: EM_X86_64
88+Sections:
89+ - Name: .gnu.version_r
90+ Type: SHT_GNU_verneed
91+ Flags: [ SHF_ALLOC ]
92+DynamicSymbols:
93+ - Name: f1
94+ Binding: STB_GLOBAL
95diff --git a/llvm/tools/llvm-objdump/ELFDump.cpp b/llvm/tools/llvm-objdump/ELFDump.cpp
96index ca73dafe2b8e..61676b4323d2 100644
97--- a/llvm/tools/llvm-objdump/ELFDump.cpp
98+++ b/llvm/tools/llvm-objdump/ELFDump.cpp
99@@ -282,27 +282,28 @@ static void printProgramHeaders(const ELFFile<ELFT> &Obj, StringRef FileName) {
100 }
101
102 template <class ELFT>
103-static void printSymbolVersionDependency(ArrayRef<uint8_t> Contents,
104- StringRef StrTab) {
105+static void printSymbolVersionDependency(StringRef FileName,
106+ const ELFFile<ELFT> &Obj,
107+ const typename ELFT::Shdr &Sec) {
108 outs() << "\nVersion References:\n";
109
110- const uint8_t *Buf = Contents.data();
111- while (Buf) {
112- auto *Verneed = reinterpret_cast<const typename ELFT::Verneed *>(Buf);
113- outs() << " required from "
114- << StringRef(StrTab.drop_front(Verneed->vn_file).data()) << ":\n";
115+ auto WarningHandler = [&](const Twine &Msg) {
116+ reportWarning(Msg, FileName);
117+ return Error::success();
118+ };
119+ Expected<std::vector<VerNeed>> V =
120+ Obj.getVersionDependencies(Sec, WarningHandler);
121+ if (!V) {
122+ reportWarning(toString(V.takeError()), FileName);
123+ return;
124+ }
125
126- const uint8_t *BufAux = Buf + Verneed->vn_aux;
127- while (BufAux) {
128- auto *Vernaux = reinterpret_cast<const typename ELFT::Vernaux *>(BufAux);
129- outs() << " "
130- << format("0x%08" PRIx32 " ", (uint32_t)Vernaux->vna_hash)
131- << format("0x%02" PRIx16 " ", (uint16_t)Vernaux->vna_flags)
132- << format("%02" PRIu16 " ", (uint16_t)Vernaux->vna_other)
133- << StringRef(StrTab.drop_front(Vernaux->vna_name).data()) << '\n';
134- BufAux = Vernaux->vna_next ? BufAux + Vernaux->vna_next : nullptr;
135- }
136- Buf = Verneed->vn_next ? Buf + Verneed->vn_next : nullptr;
137+ raw_fd_ostream &OS = outs();
138+ for (const VerNeed &VN : *V) {
139+ OS << " required from " << VN.File << ":\n";
140+ for (const VernAux &Aux : VN.AuxV)
141+ OS << format(" 0x%08x 0x%02x %02u %s\n", Aux.Hash, Aux.Flags,
142+ Aux.Other, Aux.Name.c_str());
143 }
144 }
145
146@@ -355,7 +356,7 @@ static void printSymbolVersionInfo(const ELFFile<ELFT> &Elf,
147 StringRef StrTab = unwrapOrError(Elf.getStringTable(*StrTabSec), FileName);
148
149 if (Shdr.sh_type == ELF::SHT_GNU_verneed)
150- printSymbolVersionDependency<ELFT>(Contents, StrTab);
151+ printSymbolVersionDependency<ELFT>(FileName, Elf, Shdr);
152 else
153 printSymbolVersionDefinition<ELFT>(Shdr, Contents, StrTab);
154 }
155--
1562.37.3
157
diff --git a/recipes-devtools/clang/common.inc b/recipes-devtools/clang/common.inc
index 3a4d504..7e6b1ef 100644
--- a/recipes-devtools/clang/common.inc
+++ b/recipes-devtools/clang/common.inc
@@ -45,6 +45,7 @@ SRC_URI = "\
45 file://0033-compiler-rt-Enable-__int128-for-ppc32.patch \ 45 file://0033-compiler-rt-Enable-__int128-for-ppc32.patch \
46 file://0034-llvm-Do-not-use-cmake-infra-to-detect-libzstd.patch \ 46 file://0034-llvm-Do-not-use-cmake-infra-to-detect-libzstd.patch \
47 file://0035-Revert-MIPS-compiler-rt-Fix-stat-struct-s-size-for-O.patch \ 47 file://0035-Revert-MIPS-compiler-rt-Fix-stat-struct-s-size-for-O.patch \
48 file://0001-llvm-objdump-Change-printSymbolVersionDependency-to-.patch \
48 " 49 "
49# Fallback to no-PIE if not set 50# Fallback to no-PIE if not set
50GCCPIE ??= "" 51GCCPIE ??= ""