diff options
author | Khem Raj <raj.khem@gmail.com> | 2022-03-25 14:33:38 -0700 |
---|---|---|
committer | Khem Raj <raj.khem@gmail.com> | 2023-09-08 09:08:54 -0700 |
commit | 756077c29caf19719f1bc8173700f98c32b5faf2 (patch) | |
tree | f9239e65e3be80628ed12cd65acec42408bdf2d9 | |
parent | deceaf8321d53e6e7d76393e286cc09b770d8d14 (diff) | |
download | meta-clang-756077c29caf19719f1bc8173700f98c32b5faf2.tar.gz |
clang: Add a patch to fix llvm-objdump
Signed-off-by: Khem Raj <raj.khem@gmail.com>
(cherry picked from commit 42dd5484867b772767a33340ee219fb9f42799e4)
-rw-r--r-- | recipes-devtools/clang/clang/D122505.diff | 135 | ||||
-rw-r--r-- | recipes-devtools/clang/common.inc | 1 |
2 files changed, 136 insertions, 0 deletions
diff --git a/recipes-devtools/clang/clang/D122505.diff b/recipes-devtools/clang/clang/D122505.diff new file mode 100644 index 0000000..fa154d7 --- /dev/null +++ b/recipes-devtools/clang/clang/D122505.diff | |||
@@ -0,0 +1,135 @@ | |||
1 | Upstream-Status: https://reviews.llvm.org/D122505 | ||
2 | |||
3 | diff --git a/llvm/lib/Object/ELF.cpp b/llvm/lib/Object/ELF.cpp | ||
4 | --- a/llvm/lib/Object/ELF.cpp | ||
5 | +++ b/llvm/lib/Object/ELF.cpp | ||
6 | @@ -568,11 +568,9 @@ | ||
7 | } | ||
8 | |||
9 | if (Dyn.empty()) | ||
10 | - // TODO: this error is untested. | ||
11 | return createError("invalid empty dynamic section"); | ||
12 | |||
13 | if (Dyn.back().d_tag != ELF::DT_NULL) | ||
14 | - // TODO: this error is untested. | ||
15 | return createError("dynamic sections must be DT_NULL terminated"); | ||
16 | |||
17 | return Dyn; | ||
18 | diff --git a/llvm/test/tools/llvm-objdump/ELF/dynamic-malformed.test b/llvm/test/tools/llvm-objdump/ELF/dynamic-malformed.test | ||
19 | new file mode 100644 | ||
20 | --- /dev/null | ||
21 | +++ b/llvm/test/tools/llvm-objdump/ELF/dynamic-malformed.test | ||
22 | @@ -0,0 +1,39 @@ | ||
23 | +## An empty dynamic section is invalid. Test we report a warning instead of an | ||
24 | +## error. objcopy --only-keep-debug may produce an empty dynamic section, it is | ||
25 | +## excessive to use an error. | ||
26 | +# RUN: yaml2obj %s --docnum=1 -o %t.empty | ||
27 | +# RUN: llvm-objdump -p %t.empty 2>&1 | FileCheck %s -DFILE=%t.empty --check-prefix=EMPTY | ||
28 | + | ||
29 | +# EMPTY: Program Header: | ||
30 | +# EMPTY-NEXT: warning: '[[FILE]]': invalid empty dynamic section | ||
31 | +# EMPTY-EMPTY: | ||
32 | + | ||
33 | +--- !ELF | ||
34 | +FileHeader: | ||
35 | + Class: ELFCLASS64 | ||
36 | + Data: ELFDATA2LSB | ||
37 | + Type: ET_EXEC | ||
38 | + Machine: EM_X86_64 | ||
39 | +Sections: | ||
40 | + - Name: .dynamic | ||
41 | + Type: SHT_DYNAMIC | ||
42 | + | ||
43 | +# RUN: yaml2obj %s --docnum=2 -o %t.nonull | ||
44 | +# RUN: llvm-objdump -p %t.nonull 2>&1 | FileCheck %s -DFILE=%t.nonull --check-prefix=NONULL | ||
45 | + | ||
46 | +# NONULL: Program Header: | ||
47 | +# NONULL-NEXT: warning: '[[FILE]]': dynamic sections must be DT_NULL terminated | ||
48 | +# NONULL-EMPTY: | ||
49 | + | ||
50 | +--- !ELF | ||
51 | +FileHeader: | ||
52 | + Class: ELFCLASS64 | ||
53 | + Data: ELFDATA2LSB | ||
54 | + Type: ET_EXEC | ||
55 | + Machine: EM_X86_64 | ||
56 | +Sections: | ||
57 | + - Name: .dynamic | ||
58 | + Type: SHT_DYNAMIC | ||
59 | + Entries: | ||
60 | + - Tag: DT_SONAME | ||
61 | + Value: 1 | ||
62 | diff --git a/llvm/test/tools/llvm-objdump/ELF/invalid-phdr.test b/llvm/test/tools/llvm-objdump/ELF/invalid-phdr.test | ||
63 | --- a/llvm/test/tools/llvm-objdump/ELF/invalid-phdr.test | ||
64 | +++ b/llvm/test/tools/llvm-objdump/ELF/invalid-phdr.test | ||
65 | @@ -1,11 +1,11 @@ | ||
66 | ## Test how we handle the case when the e_phoff field is invalid. | ||
67 | # RUN: yaml2obj %s -o %t | ||
68 | -# RUN: not llvm-objdump --private-headers %t 2>&1 | \ | ||
69 | +# RUN: llvm-objdump --private-headers %t 2>&1 | \ | ||
70 | # RUN: FileCheck -DFILE=%t %s --check-prefix=INVALID-PHOFF | ||
71 | |||
72 | # INVALID-PHOFF: Program Header: | ||
73 | # INVALID-PHOFF-NEXT: warning: '[[FILE]]': unable to read program headers: program headers are longer than binary of size 280: e_phoff = 0xffffff, e_phnum = 0, e_phentsize = 0 | ||
74 | -# INVALID-PHOFF-NEXT: error: '[[FILE]]': program headers are longer than binary of size 280: e_phoff = 0xffffff, e_phnum = 0, e_phentsize = 0 | ||
75 | +# INVALID-PHOFF-NEXT: warning: '[[FILE]]': program headers are longer than binary of size 280: e_phoff = 0xffffff, e_phnum = 0, e_phentsize = 0 | ||
76 | |||
77 | --- !ELF | ||
78 | FileHeader: | ||
79 | diff --git a/llvm/test/tools/llvm-objdump/ELF/program-headers.test b/llvm/test/tools/llvm-objdump/ELF/program-headers.test | ||
80 | --- a/llvm/test/tools/llvm-objdump/ELF/program-headers.test | ||
81 | +++ b/llvm/test/tools/llvm-objdump/ELF/program-headers.test | ||
82 | @@ -278,12 +278,12 @@ | ||
83 | ## Check we report an error / warning when we are unable to read program headers. | ||
84 | ## Case A: the e_phentsize field is invalid. | ||
85 | # RUN: yaml2obj --docnum=2 -DPHENTSIZE=1 %s -o %t.phdr.err | ||
86 | -# RUN: not llvm-objdump --private-headers %t.phdr.err 2>&1 | \ | ||
87 | +# RUN: llvm-objdump --private-headers %t.phdr.err 2>&1 | \ | ||
88 | # RUN: FileCheck %s -DFILE=%t.phdr.err --check-prefix=PHENTSIZE | ||
89 | |||
90 | # PHENTSIZE: Program Header: | ||
91 | # PHENTSIZE-NEXT: warning: '[[FILE]]': unable to read program headers: invalid e_phentsize: 1 | ||
92 | -# PHENTSIZE-NEXT: error: '[[FILE]]': invalid e_phentsize: 1 | ||
93 | +# PHENTSIZE-NEXT: warning: '[[FILE]]': invalid e_phentsize: 1 | ||
94 | |||
95 | --- !ELF | ||
96 | FileHeader: | ||
97 | @@ -309,16 +309,16 @@ | ||
98 | |||
99 | ## Check we report a warning / error when e_phoff goes 1 byte past the end of the file. | ||
100 | # RUN: yaml2obj --docnum=2 -DPHOFF=0x161 %s -o %t.phdr.err2 | ||
101 | -# RUN: not llvm-objdump --private-headers %t.phdr.err2 2>&1 | \ | ||
102 | +# RUN: llvm-objdump --private-headers %t.phdr.err2 2>&1 | \ | ||
103 | # RUN: FileCheck %s -DFILE=%t.phdr.err2 --check-prefix=PHOFF -DOFF=0x161 | ||
104 | |||
105 | # PHOFF: Program Header: | ||
106 | # PHOFF-NEXT: warning: '[[FILE]]': unable to read program headers: program headers are longer than binary of size 408: e_phoff = [[OFF]], e_phnum = 1, e_phentsize = 56 | ||
107 | -# PHOFF-NEXT: error: '[[FILE]]': program headers are longer than binary of size 408: e_phoff = [[OFF]], e_phnum = 1, e_phentsize = 56 | ||
108 | +# PHOFF-NEXT: warning: '[[FILE]]': program headers are longer than binary of size 408: e_phoff = [[OFF]], e_phnum = 1, e_phentsize = 56 | ||
109 | |||
110 | |||
111 | ## Check we report a warning / error when the value of e_phoff is so large that | ||
112 | ## e_phoff + e_phnum * e_phentsize > UINT64_MAX. | ||
113 | # RUN: yaml2obj --docnum=2 -DPHOFF=0xffffffffffffffff %s -o %t.phdr.err3 | ||
114 | -# RUN: not llvm-objdump --private-headers %t.phdr.err3 2>&1 | \ | ||
115 | +# RUN: llvm-objdump --private-headers %t.phdr.err3 2>&1 | \ | ||
116 | # RUN: FileCheck %s -DFILE=%t.phdr.err3 --check-prefix=PHOFF -DOFF=0xffffffffffffffff | ||
117 | diff --git a/llvm/tools/llvm-objdump/ELFDump.cpp b/llvm/tools/llvm-objdump/ELFDump.cpp | ||
118 | --- a/llvm/tools/llvm-objdump/ELFDump.cpp | ||
119 | +++ b/llvm/tools/llvm-objdump/ELFDump.cpp | ||
120 | @@ -171,8 +171,12 @@ | ||
121 | |||
122 | template <class ELFT> | ||
123 | static void printDynamicSection(const ELFFile<ELFT> &Elf, StringRef Filename) { | ||
124 | - ArrayRef<typename ELFT::Dyn> DynamicEntries = | ||
125 | - unwrapOrError(Elf.dynamicEntries(), Filename); | ||
126 | + auto DynamicEntriesOrErr = Elf.dynamicEntries(); | ||
127 | + if (!DynamicEntriesOrErr) { | ||
128 | + reportWarning(toString(DynamicEntriesOrErr.takeError()), Filename); | ||
129 | + return; | ||
130 | + } | ||
131 | + ArrayRef<typename ELFT::Dyn> DynamicEntries = *DynamicEntriesOrErr; | ||
132 | |||
133 | // Find the maximum tag name length to format the value column properly. | ||
134 | size_t MaxLen = 0; | ||
135 | |||
diff --git a/recipes-devtools/clang/common.inc b/recipes-devtools/clang/common.inc index b61d239..ba47dd1 100644 --- a/recipes-devtools/clang/common.inc +++ b/recipes-devtools/clang/common.inc | |||
@@ -45,6 +45,7 @@ SRC_URI = "\ | |||
45 | file://0033-lldb-Link-with-libatomic-on-x86.patch \ | 45 | file://0033-lldb-Link-with-libatomic-on-x86.patch \ |
46 | file://0034-clang-exclude-openembedded-distributions-from-settin.patch \ | 46 | file://0034-clang-exclude-openembedded-distributions-from-settin.patch \ |
47 | file://0035-compiler-rt-Enable-__int128-for-ppc32.patch \ | 47 | file://0035-compiler-rt-Enable-__int128-for-ppc32.patch \ |
48 | file://D122505.diff \ | ||
48 | " | 49 | " |
49 | # Fallback to no-PIE if not set | 50 | # Fallback to no-PIE if not set |
50 | GCCPIE ??= "" | 51 | GCCPIE ??= "" |