1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00

[llvm-readobj] - Don't abort when dumping dynamic relocations when an object has both REL and RELA.

Currently, llvm-readobj calls `report_fatal_error` when an object has
both REL and RELA dynamic relocations.

llvm-readelf is able to handle this case properly. This patch adds such a test case
and adjusts the llvm-readobj code to follow (and be consistent with its own RELR and PLTREL cases).

Differential revision: https://reviews.llvm.org/D83232
This commit is contained in:
Georgii Rymar 2020-07-06 18:07:35 +03:00
parent 7fd13f8bce
commit d4b928b169
2 changed files with 67 additions and 4 deletions

View File

@ -463,3 +463,64 @@ ProgramHeaders:
Sections:
- Section: .rela.dyn
- Section: .dynamic
## Show that when we have both REL and RELA relocations, we dump both sets.
# RUN: yaml2obj --docnum=13 %s -o %t13
# RUN: llvm-readobj --dyn-relocations %t13 2>&1 | FileCheck %s -DFILE=%t13 --check-prefix=BOTH-RELA-REL-LLVM
# RUN: llvm-readelf --dyn-relocations %t13 2>&1 | FileCheck %s -DFILE=%t13 --check-prefix=BOTH-RELA-REL-GNU
# BOTH-RELA-REL-LLVM: Dynamic Relocations {
# BOTH-RELA-REL-LLVM-NEXT: 0x1 R_X86_64_NONE - 0x0
# BOTH-RELA-REL-LLVM-NEXT: 0x2 R_X86_64_NONE - 0x0
# BOTH-RELA-REL-LLVM-NEXT: }
# BOTH-RELA-REL-GNU: 'RELA' relocation section at offset 0x78 contains 24 bytes:
# BOTH-RELA-REL-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
# BOTH-RELA-REL-GNU-NEXT: 0000000000000001 0000000000000000 R_X86_64_NONE 0
# BOTH-RELA-REL-GNU-EMPTY:
# BOTH-RELA-REL-GNU: 'REL' relocation section at offset 0x90 contains 16 bytes:
# BOTH-RELA-REL-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name
# BOTH-RELA-REL-GNU-NEXT: 0000000000000002 0000000000000000 R_X86_64_NONE
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_X86_64
Sections:
- Name: .rela.dyn
Type: SHT_RELA
Relocations:
- Type: R_X86_64_NONE
Offset: 0x1
- Name: .rel.dyn
Type: SHT_REL
Relocations:
- Type: R_X86_64_NONE
Offset: 0x2
- Name: .dynamic
Type: SHT_DYNAMIC
Entries:
- Tag: DT_RELA
Value: 0x0
- Tag: DT_RELASZ
Value: 0x18
- Tag: DT_RELAENT
Value: 0x18
## 0x18 == offset of .rel.dyn == size of .rela.dyn section.
- Tag: DT_REL
Value: 0x18
- Tag: DT_RELSZ
Value: 0x10
- Tag: DT_RELENT
Value: 0x10
- Tag: DT_NULL
Value: 0x0
DynamicSymbols: []
ProgramHeaders:
- Type: PT_LOAD
Sections:
- Section: .rela.dyn
- Section: .rel.dyn
- Section: .dynamic

View File

@ -6401,14 +6401,14 @@ void LLVMStyle<ELFT>::printDynamicRelocations(const ELFO *Obj) {
const DynRegionInfo &DynRelaRegion = this->dumper()->getDynRelaRegion();
const DynRegionInfo &DynRelrRegion = this->dumper()->getDynRelrRegion();
const DynRegionInfo &DynPLTRelRegion = this->dumper()->getDynPLTRelRegion();
if (DynRelRegion.Size && DynRelaRegion.Size)
report_fatal_error("There are both REL and RELA dynamic relocations");
W.startLine() << "Dynamic Relocations {\n";
W.indent();
if (DynRelaRegion.Size > 0)
if (DynRelaRegion.Size > 0) {
for (const Elf_Rela &Rela : this->dumper()->dyn_relas())
printDynamicRelocation(Obj, Rela);
else
}
if (DynRelRegion.Size > 0) {
for (const Elf_Rel &Rel : this->dumper()->dyn_rels()) {
Elf_Rela Rela;
Rela.r_offset = Rel.r_offset;
@ -6416,6 +6416,8 @@ void LLVMStyle<ELFT>::printDynamicRelocations(const ELFO *Obj) {
Rela.r_addend = 0;
printDynamicRelocation(Obj, Rela);
}
}
if (DynRelrRegion.Size > 0) {
Elf_Relr_Range Relrs = this->dumper()->dyn_relrs();
std::vector<Elf_Rela> RelrRelas =