[llvm-readobj] - Remove unwrapOrError calls from GNUStyle<ELFT>::printRelocations.

This fixes existent FIXMEs: we should not error out when unable to
find the number of relocations.

Differential revision: https://reviews.llvm.org/D85891
This commit is contained in:
Georgii Rymar 2020-08-13 13:24:39 +03:00
parent 3f7068ad98
commit bc902191d3
3 changed files with 49 additions and 27 deletions
llvm
test/tools/llvm-readobj/ELF
tools/llvm-readobj

View File

@ -49,7 +49,7 @@ Symbols:
# RUN: yaml2obj --docnum=1 -DSHOFFSET=0xffffffff %s -o %t1.broken
# RUN: llvm-readobj --relocations %t1.broken 2>&1 | FileCheck -DFILE=%t1.broken --check-prefix=BROKEN-RELA-LLVM %s
# RUN: not llvm-readelf --relocations %t1.broken 2>&1 | FileCheck -DFILE=%t1.broken --check-prefix=BROKEN-RELA-GNU %s
# RUN: llvm-readelf --relocations %t1.broken 2>&1 | FileCheck -DFILE=%t1.broken --check-prefix=BROKEN-RELA-GNU %s
# BROKEN-RELA-LLVM: Relocations [
# BROKEN-RELA-LLVM-NEXT: Section (1) .rela.dyn {
@ -57,8 +57,10 @@ Symbols:
# BROKEN-RELA-LLVM-NEXT: }
# BROKEN-RELA-LLVM-NEXT: ]
## FIXME: GNU still reports an error before trying to dump relocations.
# BROKEN-RELA-GNU: error: '[[FILE]]': section [index 1] has a sh_offset (0xffffffff) + sh_size (0x3a) that is greater than the file size (0x238)
# BROKEN-RELA-GNU: warning: '[[FILE]]': unable to get the number of relocations in SHT_ANDROID_RELA section with index 1: section [index 1] has a sh_offset (0xffffffff) + sh_size (0x3a) that is greater than the file size (0x238)
# BROKEN-RELA-GNU: Relocation section '.rela.dyn' at offset 0xffffffff contains <?> entries:
# BROKEN-RELA-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
# BROKEN-RELA-GNU-NEXT: warning: '[[FILE]]': unable to read relocations from SHT_ANDROID_RELA section with index 1: section [index 1] has a sh_offset (0xffffffff) + sh_size (0x3a) that is greater than the file size (0x238)
## Check we report a warning when the sh_link field of the SHT_ANDROID_RELA section is broken.
@ -130,7 +132,7 @@ Symbols:
# RUN: yaml2obj --docnum=2 -DSHOFFSET=0xffffffff %s -o %t2.broken
# RUN: llvm-readobj --relocations %t2.broken 2>&1 | FileCheck -DFILE=%t2.broken --check-prefix=BROKEN-REL-LLVM %s
# RUN: not llvm-readelf --relocations %t2.broken 2>&1 | FileCheck -DFILE=%t2.broken --check-prefix=BROKEN-REL-GNU %s
# RUN: llvm-readelf --relocations %t2.broken 2>&1 | FileCheck -DFILE=%t2.broken --check-prefix=BROKEN-REL-GNU %s
# BROKEN-REL-LLVM: Relocations [
# BROKEN-REL-LLVM-NEXT: Section (1) .rel.dyn {
@ -138,8 +140,10 @@ Symbols:
# BROKEN-REL-LLVM-NEXT: }
# BROKEN-REL-LLVM-NEXT: ]
## FIXME: GNU still reports an error before trying to dump relocations.
# BROKEN-REL-GNU: error: '[[FILE]]': section [index 1] has a sh_offset (0xffffffff) + sh_size (0x12) that cannot be represented
# BROKEN-REL-GNU: warning: '[[FILE]]': unable to get the number of relocations in SHT_ANDROID_REL section with index 1: section [index 1] has a sh_offset (0xffffffff) + sh_size (0x12) that cannot be represented
# BROKEN-REL-GNU: Relocation section '.rel.dyn' at offset 0xffffffff contains <?> entries:
# BROKEN-REL-GNU-NEXT: Offset Info Type Sym. Value Symbol's Name
# BROKEN-REL-GNU-NEXT: warning: '[[FILE]]': unable to read relocations from SHT_ANDROID_REL section with index 1: section [index 1] has a sh_offset (0xffffffff) + sh_size (0x12) that cannot be represented
## Check we report a warning when the sh_link field of the SHT_ANDROID_REL section is broken.

View File

@ -160,8 +160,8 @@ Sections:
# RUN: yaml2obj --docnum=2 -DENTSIZE=1 %s -o %t2.broken
# RUN: llvm-readobj --relocations %t2.broken 2>&1 | \
# RUN: FileCheck -DFILE=%t2.broken --check-prefix=BROKEN-LLVM %s -DSECNAME=SHT_RELR
# RUN: not llvm-readelf --relocations %t2.broken 2>&1 | \
# RUN: FileCheck -DFILE=%t2.broken --check-prefix=BROKEN-GNU %s
# RUN: llvm-readelf --relocations %t2.broken 2>&1 | \
# RUN: FileCheck -DFILE=%t2.broken --check-prefix=BROKEN-GNU %s -DSECNAME=SHT_RELR
# BROKEN-LLVM: Relocations [
# BROKEN-LLVM-NEXT: Section (1) .relr.dyn {
@ -169,17 +169,18 @@ Sections:
# BROKEN-LLVM-NEXT: }
# BROKEN-LLVM-NEXT: ]
## FIXME: GNU still reports an error before trying to dump relocations.
# BROKEN-GNU: error: '[[FILE]]': section [index 1] has an invalid sh_entsize: 1
# BROKEN-GNU: warning: '[[FILE]]': unable to get the number of relocations in [[SECNAME]] section with index 1: section [index 1] has an invalid sh_entsize: 1
# BROKEN-GNU: Relocation section '.relr.dyn' at offset 0x34 contains <?> entries:
# BROKEN-GNU-NEXT: Offset Info Type Sym. Value Symbol's Name
# BROKEN-GNU-NEXT: warning: '[[FILE]]': unable to read relocations from [[SECNAME]] section with index 1: section [index 1] has an invalid sh_entsize: 1
## Case B: check the case when relocations can't be read from an SHT_ANDROID_RELR section.
## SHT_ANDROID_RELR = 0x6fffff00.
# RUN: yaml2obj --docnum=2 -DENTSIZE=1 -DSHTYPE=0x6fffff00 %s -o %t2.broken.android
# RUN: llvm-readobj --relocations %t2.broken.android 2>&1 | \
# RUN: FileCheck -DFILE=%t2.broken.android --check-prefix=BROKEN-LLVM %s -DSECNAME=SHT_ANDROID_RELR
# RUN: not llvm-readelf --relocations %t2.broken.android 2>&1 | \
# RUN: FileCheck -DFILE=%t2.broken.android --check-prefix=BROKEN-GNU %s
# RUN: llvm-readelf --relocations %t2.broken.android 2>&1 | \
# RUN: FileCheck -DFILE=%t2.broken.android --check-prefix=BROKEN-GNU %s -DSECNAME=SHT_ANDROID_RELR
## Check the behavior when the sh_link field of the SHT_RELR/SHT_ANDROID_RELR section
## is set to an arbitrary value. Normally, it is set to 0, because such sections contains

View File

@ -3749,30 +3749,47 @@ static bool isRelocationSec(const typename ELFT::Shdr &Sec) {
}
template <class ELFT> void GNUStyle<ELFT>::printRelocations(const ELFO *Obj) {
auto GetEntriesNum = [&](const Elf_Shdr &Sec) -> Expected<size_t> {
// Android's packed relocation section needs to be unpacked first
// to get the actual number of entries.
if (Sec.sh_type == ELF::SHT_ANDROID_REL ||
Sec.sh_type == ELF::SHT_ANDROID_RELA) {
Expected<std::vector<typename ELFT::Rela>> RelasOrErr =
Obj->android_relas(&Sec);
if (!RelasOrErr)
return RelasOrErr.takeError();
return RelasOrErr->size();
}
if (!opts::RawRelr && (Sec.sh_type == ELF::SHT_RELR ||
Sec.sh_type == ELF::SHT_ANDROID_RELR)) {
Expected<Elf_Relr_Range> RelrsOrErr = Obj->relrs(&Sec);
if (!RelrsOrErr)
return RelrsOrErr.takeError();
return Obj->decode_relrs(*RelrsOrErr).size();
}
return Sec.getEntityCount();
};
bool HasRelocSections = false;
for (const Elf_Shdr &Sec : cantFail(Obj->sections())) {
if (!isRelocationSec<ELFT>(Sec))
continue;
HasRelocSections = true;
unsigned Entries;
// Android's packed relocation section needs to be unpacked first
// to get the actual number of entries.
if (Sec.sh_type == ELF::SHT_ANDROID_REL ||
Sec.sh_type == ELF::SHT_ANDROID_RELA) {
Entries = unwrapOrError(this->FileName, Obj->android_relas(&Sec)).size();
} else if (!opts::RawRelr && (Sec.sh_type == ELF::SHT_RELR ||
Sec.sh_type == ELF::SHT_ANDROID_RELR)) {
Elf_Relr_Range Relrs = unwrapOrError(this->FileName, Obj->relrs(&Sec));
Entries = Obj->decode_relrs(Relrs).size();
} else {
Entries = Sec.getEntityCount();
}
std::string EntriesNum = "<?>";
if (Expected<size_t> NumOrErr = GetEntriesNum(Sec))
EntriesNum = std::to_string(*NumOrErr);
else
this->reportUniqueWarning(createError(
"unable to get the number of relocations in " + describe(Obj, Sec) +
": " + toString(NumOrErr.takeError())));
uintX_t Offset = Sec.sh_offset;
StringRef Name = this->getPrintableSectionName(Obj, Sec);
OS << "\nRelocation section '" << Name << "' at offset 0x"
<< to_hexString(Offset, false) << " contains " << Entries
<< to_hexString(Offset, false) << " contains " << EntriesNum
<< " entries:\n";
printRelocHeader(Sec.sh_type);
this->printRelocationsHelper(Obj, Sec);