mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-27 20:06:20 +00:00
[ELF][PPC64] Don't report "relocation refers to a discarded section" for .toc
Summary: clang (as of 2019-06-12) / gcc (as of 8.2.1) PPC64 may emit a .rela.toc which references an embedded switch table in a discarded .rodata/.text section. The .toc and the .rela.toc are incorrectly not placed in the comdat. Technically a relocation from outside the group is not allowed by the ELF spec: > A symbol table entry with STB_LOCAL binding that is defined relative > to one of a group's sections, and that is contained in a symbol table > section that is not part of the group, must be discarded if the group > members are discarded. References to this symbol table entry from > outside the group are not allowed. Don't report errors to work around the bug. This should fix the ppc64le-lld-multistage-test bot while linking llvm-tblgen: ld.lld: error: relocation refers to a discarded section: .rodata._ZNK4llvm3MVT13getSizeInBitsEv >>> defined in utils/TableGen/CMakeFiles/llvm-tblgen.dir/CodeGenRegisters.cpp.o >>> referenced by CodeGenRegisters.cpp >>> utils/TableGen/CMakeFiles/llvm-tblgen.dir/CodeGenRegisters.cpp.o:(.toc+0x0) Some other PPC specific sections may have similar problems. We can blacklist more section names when problems occur. // A simple program that reproduces the bug. // Note .rela.toc (outside the group) references a section symbol (STB_LOCAL) in a group. void puts(const char *); struct A { void foo(int a) { switch (a) { case 0: puts("0"); break; case 1: puts("1"); puts("1"); break; case 2: puts("2"); break; case 3: puts("3"); puts("4"); break; case 4: puts("4"); break; case 5: puts("5"); puts("5"); break; case 6: puts("6"); break; } } int a; }; void foo(A x) { x.foo(x.a); } Reviewers: ruiu, sfertile, espindola Reviewed By: ruiu Subscribers: emaste, nemanjai, arichardson, kbarton, jsji, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D63182 llvm-svn: 363126
This commit is contained in:
parent
ed4cd44870
commit
11549e5c46
@ -438,11 +438,13 @@ void InputSection::copyRelocations(uint8_t *Buf, ArrayRef<RelTy> Rels) {
|
||||
// relocation in it pointing to discarded sections with R_*_NONE, which
|
||||
// hopefully creates a frame that is ignored at runtime. Also, don't warn
|
||||
// on .gcc_except_table and debug sections.
|
||||
//
|
||||
// See the comment in maybeReportUndefined for PPC64 .toc .
|
||||
auto *D = dyn_cast<Defined>(&Sym);
|
||||
if (!D) {
|
||||
if (!Sec->Name.startswith(".debug") &&
|
||||
!Sec->Name.startswith(".zdebug") && Sec->Name != ".eh_frame" &&
|
||||
Sec->Name != ".gcc_except_table") {
|
||||
Sec->Name != ".gcc_except_table" && Sec->Name != ".toc") {
|
||||
uint32_t SecIdx = cast<Undefined>(Sym).DiscardedSecIdx;
|
||||
Elf_Shdr_Impl<ELFT> Sec =
|
||||
CHECK(File->getObj().sections(), File)[SecIdx];
|
||||
|
@ -718,6 +718,15 @@ static bool maybeReportUndefined(Symbol &Sym, InputSectionBase &Sec,
|
||||
if (Config->UnresolvedSymbols == UnresolvedPolicy::Ignore && CanBeExternal)
|
||||
return false;
|
||||
|
||||
// clang (as of 2019-06-12) / gcc (as of 8.2.1) PPC64 may emit a .rela.toc
|
||||
// which references a switch table in a discarded .rodata/.text section. The
|
||||
// .toc and the .rela.toc are incorrectly not placed in the comdat. The ELF
|
||||
// spec says references from outside the group to a STB_LOCAL symbol are not
|
||||
// allowed. Work around the bug.
|
||||
if (Config->EMachine == EM_PPC64 &&
|
||||
cast<Undefined>(Sym).DiscardedSecIdx != 0 && Sec.Name == ".toc")
|
||||
return false;
|
||||
|
||||
auto Visibility = [&]() -> std::string {
|
||||
switch (Sym.Visibility) {
|
||||
case STV_INTERNAL:
|
||||
|
17
lld/test/ELF/comdat-discarded-ppc64.s
Normal file
17
lld/test/ELF/comdat-discarded-ppc64.s
Normal file
@ -0,0 +1,17 @@
|
||||
# REQUIRES: ppc
|
||||
# RUN: llvm-mc -filetype=obj -triple=powerpc64le %s -o %t.o
|
||||
# RUN: ld.lld %t.o %t.o -o /dev/null
|
||||
# RUN: ld.lld -r --fatal-warnings %t.o %t.o -o /dev/null
|
||||
|
||||
## clang/gcc PPC64 may emit a .rela.toc which references a switch table in a
|
||||
## discarded .rodata/.text section. The .toc and the .rela.toc are incorrectly
|
||||
## not placed in the comdat.
|
||||
## Don't error "relocation refers to a discarded section".
|
||||
|
||||
.section .text.foo,"axG",@progbits,foo,comdat
|
||||
.globl foo
|
||||
foo:
|
||||
.L0:
|
||||
|
||||
.section .toc,"aw"
|
||||
.quad .L0
|
Loading…
x
Reference in New Issue
Block a user