--- /dev/null
+# RUN: yaml2obj %s -o %t
+# RUN: not llvm-readelf --headers -S 2>&1 %t | FileCheck %s -DFILE=%t --check-prefix=GNU
+# RUN: not llvm-readobj --headers -S 2>&1 %t | FileCheck %s -DFILE=%t --check-prefix=LLVM
+
+# GNU: ELF Header:
+# GNU: Section header string table index: 255
+# GNU-NEXT: There are 4 section headers, starting at offset 0x40:
+# GNU: Section Headers:
+# GNU-NEXT: [Nr] Name
+# GNU-EMPTY:
+# GNU-NEXT: error: '[[FILE]]': section header string table index 255 does not exist
+
+# LLVM: ElfHeader {
+# LLVM: StringTableSectionIndex: 255
+# LLVM-NEXT: }
+# LLVM-NEXT: Sections [
+# LLVM-EMPTY:
+# LLVM-NEXT: error: '[[FILE]]': section header string table index 255 does not exist
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+ SHStrNdx: 0xFF
void printELFLinkerOptions() override;
+ const object::ELFObjectFile<ELFT> *getElfObject() const { return ObjF; };
+
private:
std::unique_ptr<DumpStyle<ELFT>> ELFDumperStyle;
template <class ELFT>
static StringRef getSectionName(const typename ELFT::Shdr &Sec,
- const ELFFile<ELFT> &Obj,
+ const ELFObjectFile<ELFT> &ElfObj,
ArrayRef<typename ELFT::Shdr> Sections) {
+ const ELFFile<ELFT> &Obj = *ElfObj.getELFFile();
uint32_t Index = Obj.getHeader()->e_shstrndx;
if (Index == ELF::SHN_XINDEX)
Index = Sections[0].sh_link;
if (!Index) // no section string table.
return "";
+ // TODO: Test a case when the sh_link of the section with index 0 is broken.
if (Index >= Sections.size())
- reportError("invalid section index");
+ reportError(ElfObj.getFileName(),
+ createError("section header string table index " +
+ Twine(Index) + " does not exist"));
StringRef Data = toStringRef(unwrapOrError(
Obj.template getSectionContentsAsArray<uint8_t>(&Sections[Index])));
return unwrapOrError(Obj.getSectionName(&Sec, Data));
printField(F);
OS << "\n";
+ const ELFObjectFile<ELFT> *ElfObj = this->dumper()->getElfObject();
size_t SectionIndex = 0;
for (const Elf_Shdr &Sec : Sections) {
Fields[0].Str = to_string(SectionIndex);
- Fields[1].Str = getSectionName(Sec, *Obj, Sections);
+ Fields[1].Str = getSectionName(Sec, *ElfObj, Sections);
Fields[2].Str =
getSectionTypeString(Obj->getHeader()->e_machine, Sec.sh_type);
Fields[3].Str =
int SectionIndex = -1;
ArrayRef<Elf_Shdr> Sections = unwrapOrError(Obj->sections());
+ const ELFObjectFile<ELFT> *ElfObj = this->dumper()->getElfObject();
for (const Elf_Shdr &Sec : Sections) {
- StringRef Name = getSectionName(Sec, *Obj, Sections);
+ StringRef Name = getSectionName(Sec, *ElfObj, Sections);
DictScope SectionD(W, "Section");
W.printNumber("Index", ++SectionIndex);
W.printNumber("Name", Name, Sec.sh_name);
namespace llvm {
LLVM_ATTRIBUTE_NORETURN void reportError(Twine Msg) {
+ fouts().flush();
errs() << "\n";
WithColor::error(errs()) << Msg << "\n";
exit(1);
}
+void reportError(StringRef Input, Error Err) {
+ if (Input == "-")
+ Input = "<stdin>";
+ error(createFileError(Input, std::move(Err)));
+}
+
void reportWarning(Twine Msg) {
fouts().flush();
errs() << "\n";
} // namespace llvm
-static void reportError(StringRef Input, Error Err) {
- if (Input == "-")
- Input = "<stdin>";
- error(createFileError(Input, std::move(Err)));
-}
-
static void reportError(StringRef Input, std::error_code EC) {
reportError(Input, errorCodeToError(EC));
}