Skip to content

Commit

Permalink
[llvm-readobj] - Do not fail to dump the object which has wrong type …
Browse files Browse the repository at this point in the history
…of .shstrtab.

Imagine we have object that has .shstrtab with type != SHT_STRTAB.
In this case, we fail to dump the object, though GNU readelf dumps it without
any issues and warnings.

This patch fixes that. It adds a code to ELFDumper.cpp which is based on the implementation of getSectionName from the ELF.h:

https://github.com/llvm-mirror/llvm/blob/master/include/llvm/Object/ELF.h#L608
https://github.com/llvm-mirror/llvm/blob/master/include/llvm/Object/ELF.h#L431
https://github.com/llvm-mirror/llvm/blob/master/include/llvm/Object/ELF.h#L539

The difference is that all non critical errors are ommitted what allows us to
improve the dumping on a tool side. Also, this opens a road for a follow-up that
should allow us to dump the section headers, but drop the section names in case if .shstrtab is completely absent and/or broken.

Differential revision: https://reviews.llvm.org/D63266

llvm-svn: 363371
  • Loading branch information
George Rimar committed Jun 14, 2019
1 parent 3058a62 commit d6df7de
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 7 deletions.
Binary file not shown.
11 changes: 11 additions & 0 deletions llvm/test/tools/llvm-readobj/elf-wrong-shstrtab-type.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
## wrong-shstrtab-type.elf-x86-64 contains .shstrtab section which has SHT_PROGBITS type.
## Check we do not fail to dump the section headers in this case.

# RUN: llvm-readobj -S %p/Inputs/wrong-shstrtab-type.elf-x86-64 | FileCheck %s --check-prefix LLVM
# RUN: llvm-readelf -S %p/Inputs/wrong-shstrtab-type.elf-x86-64 | FileCheck %s --check-prefix GNU

# LLVM: Name: .shstrtab
# LLVM-NEXT: Type: SHT_PROGBITS

# GNU: [Nr] Name Type
# GNU: [ 3] .shstrtab PROGBITS
28 changes: 21 additions & 7 deletions llvm/tools/llvm-readobj/ELFDumper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3003,6 +3003,22 @@ static std::string getSectionTypeString(unsigned Arch, unsigned Type) {
return "";
}

template <class ELFT>
static StringRef getSectionName(const typename ELFT::Shdr &Sec,
const ELFFile<ELFT> &Obj,
ArrayRef<typename ELFT::Shdr> Sections) {
uint32_t Index = Obj.getHeader()->e_shstrndx;
if (Index == ELF::SHN_XINDEX)
Index = Sections[0].sh_link;
if (!Index) // no section string table.
return "";
if (Index >= Sections.size())
reportError("invalid section index");
StringRef Data = toStringRef(unwrapOrError(
Obj.template getSectionContentsAsArray<uint8_t>(&Sections[Index])));
return unwrapOrError(Obj.getSectionName(&Sec, Data));
}

template <class ELFT>
void GNUStyle<ELFT>::printSectionHeaders(const ELFO *Obj) {
unsigned Bias = ELFT::Is64Bits ? 0 : 8;
Expand All @@ -3023,7 +3039,7 @@ void GNUStyle<ELFT>::printSectionHeaders(const ELFO *Obj) {
size_t SectionIndex = 0;
for (const Elf_Shdr &Sec : Sections) {
Fields[0].Str = to_string(SectionIndex);
Fields[1].Str = unwrapOrError(Obj->getSectionName(&Sec));
Fields[1].Str = getSectionName(Sec, *Obj, Sections);
Fields[2].Str =
getSectionTypeString(Obj->getHeader()->e_machine, Sec.sh_type);
Fields[3].Str =
Expand Down Expand Up @@ -4569,13 +4585,11 @@ void LLVMStyle<ELFT>::printSectionHeaders(const ELFO *Obj) {
ListScope SectionsD(W, "Sections");

int SectionIndex = -1;
for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) {
++SectionIndex;

StringRef Name = unwrapOrError(Obj->getSectionName(&Sec));

ArrayRef<Elf_Shdr> Sections = unwrapOrError(Obj->sections());
for (const Elf_Shdr &Sec : Sections) {
StringRef Name = getSectionName(Sec, *Obj, Sections);
DictScope SectionD(W, "Section");
W.printNumber("Index", SectionIndex);
W.printNumber("Index", ++SectionIndex);
W.printNumber("Name", Name, Sec.sh_name);
W.printHex(
"Type",
Expand Down

0 comments on commit d6df7de

Please sign in to comment.