diff options
author | Khem Raj <raj.khem@gmail.com> | 2022-09-13 00:26:21 -0700 |
---|---|---|
committer | Khem Raj <raj.khem@gmail.com> | 2022-09-13 14:07:34 -0700 |
commit | 786911cebb177d9c835e9e8bc358ed2b8011a722 (patch) | |
tree | df8c00c09b8f6c02c938db5e7c466fdd4ef172d7 /recipes-devtools | |
parent | 0ad6be9324bc16716ecd0b7fbbcbfd1e4aa5fc2c (diff) | |
download | meta-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-.patch | 157 | ||||
-rw-r--r-- | recipes-devtools/clang/common.inc | 1 |
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 @@ | |||
1 | From 1a4646b30f627ef92c1de6cd65f6d0cc87b0ef11 Mon Sep 17 00:00:00 2001 | ||
2 | From: Khem Raj <raj.khem@gmail.com> | ||
3 | Date: Tue, 13 Sep 2022 00:24:10 -0700 | ||
4 | Subject: [PATCH] [llvm-objdump] Change printSymbolVersionDependency to use | ||
5 | ELFFile API | ||
6 | |||
7 | When .gnu.version_r is empty (allowed by readelf but warned by objdump), | ||
8 | llvm-objdump -p may decode the next section as .gnu.version_r and may crash due | ||
9 | to out-of-bounds C string reference. ELFFile<ELFT>::getVersionDependencies | ||
10 | handles 0-entry .gnu.version_r gracefully. Just use it. | ||
11 | |||
12 | Fix https://github.com/llvm/llvm-project/issues/57707 | ||
13 | |||
14 | Upstream-Status: Submitted [https://reviews.llvm.org/D133751] | ||
15 | Signed-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 | |||
24 | diff --git a/llvm/include/llvm/Object/ELF.h b/llvm/include/llvm/Object/ELF.h | ||
25 | index 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 | |||
37 | diff --git a/llvm/test/tools/llvm-objdump/ELF/verneed-invalid.test b/llvm/test/tools/llvm-objdump/ELF/verneed-invalid.test | ||
38 | new file mode 100644 | ||
39 | index 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: [] | ||
67 | diff --git a/llvm/test/tools/llvm-objdump/ELF/verneed.test b/llvm/test/tools/llvm-objdump/ELF/verneed.test | ||
68 | index 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 | ||
95 | diff --git a/llvm/tools/llvm-objdump/ELFDump.cpp b/llvm/tools/llvm-objdump/ELFDump.cpp | ||
96 | index 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 | -- | ||
156 | 2.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 |
50 | GCCPIE ??= "" | 51 | GCCPIE ??= "" |