std::error_code dumpRelocation(const RelT *Rel, const Elf_Shdr *SymTab,
ELFYAML::Relocation &R);
- ErrorOr<ELFYAML::RelocationSection *> dumpRelSection(const Elf_Shdr *Shdr);
- ErrorOr<ELFYAML::RelocationSection *> dumpRelaSection(const Elf_Shdr *Shdr);
+ ErrorOr<ELFYAML::RelocationSection *> dumpRelocSection(const Elf_Shdr *Shdr);
ErrorOr<ELFYAML::RawContentSection *>
dumpContentSection(const Elf_Shdr *Shdr);
ErrorOr<ELFYAML::NoBitsSection *> dumpNoBitsSection(const Elf_Shdr *Shdr);
ShndxTable = *TableOrErr;
break;
}
+ case ELF::SHT_REL:
case ELF::SHT_RELA: {
- ErrorOr<ELFYAML::RelocationSection *> S = dumpRelaSection(&Sec);
- if (std::error_code EC = S.getError())
- return EC;
- Y->Sections.push_back(std::unique_ptr<ELFYAML::Section>(S.get()));
- break;
- }
- case ELF::SHT_REL: {
- ErrorOr<ELFYAML::RelocationSection *> S = dumpRelSection(&Sec);
+ ErrorOr<ELFYAML::RelocationSection *> S = dumpRelocSection(&Sec);
if (std::error_code EC = S.getError())
return EC;
Y->Sections.push_back(std::unique_ptr<ELFYAML::Section>(S.get()));
template <class ELFT>
ErrorOr<ELFYAML::RelocationSection *>
-ELFDumper<ELFT>::dumpRelSection(const Elf_Shdr *Shdr) {
- assert(Shdr->sh_type == ELF::SHT_REL && "Section type is not SHT_REL");
- auto S = make_unique<ELFYAML::RelocationSection>();
-
- if (std::error_code EC = dumpCommonRelocationSection(Shdr, *S))
- return EC;
-
- auto SymTabOrErr = Obj.getSection(Shdr->sh_link);
- if (!SymTabOrErr)
- return errorToErrorCode(SymTabOrErr.takeError());
- const Elf_Shdr *SymTab = *SymTabOrErr;
-
- auto Rels = Obj.rels(Shdr);
- if (!Rels)
- return errorToErrorCode(Rels.takeError());
- for (const Elf_Rel &Rel : *Rels) {
- ELFYAML::Relocation R;
- if (std::error_code EC = dumpRelocation(&Rel, SymTab, R))
- return EC;
- S->Relocations.push_back(R);
- }
-
- return S.release();
-}
-
-template <class ELFT>
-ErrorOr<ELFYAML::RelocationSection *>
-ELFDumper<ELFT>::dumpRelaSection(const Elf_Shdr *Shdr) {
- assert(Shdr->sh_type == ELF::SHT_RELA && "Section type is not SHT_RELA");
+ELFDumper<ELFT>::dumpRelocSection(const Elf_Shdr *Shdr) {
auto S = make_unique<ELFYAML::RelocationSection>();
-
if (std::error_code EC = dumpCommonRelocationSection(Shdr, *S))
return EC;
return errorToErrorCode(SymTabOrErr.takeError());
const Elf_Shdr *SymTab = *SymTabOrErr;
- auto Rels = Obj.relas(Shdr);
- if (!Rels)
- return errorToErrorCode(Rels.takeError());
- for (const Elf_Rela &Rel : *Rels) {
- ELFYAML::Relocation R;
- if (std::error_code EC = dumpRelocation(&Rel, SymTab, R))
- return EC;
- R.Addend = Rel.r_addend;
- S->Relocations.push_back(R);
+ if (Shdr->sh_type == ELF::SHT_REL) {
+ auto Rels = Obj.rels(Shdr);
+ if (!Rels)
+ return errorToErrorCode(Rels.takeError());
+ for (const Elf_Rel &Rel : *Rels) {
+ ELFYAML::Relocation R;
+ if (std::error_code EC = dumpRelocation(&Rel, SymTab, R))
+ return EC;
+ S->Relocations.push_back(R);
+ }
+ } else {
+ auto Rels = Obj.relas(Shdr);
+ if (!Rels)
+ return errorToErrorCode(Rels.takeError());
+ for (const Elf_Rela &Rel : *Rels) {
+ ELFYAML::Relocation R;
+ if (std::error_code EC = dumpRelocation(&Rel, SymTab, R))
+ return EC;
+ R.Addend = Rel.r_addend;
+ S->Relocations.push_back(R);
+ }
}
return S.release();