-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[obj2yaml] Support CREL #98116
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[obj2yaml] Support CREL #98116
Conversation
Created using spr 1.3.5-bogner
@llvm/pr-subscribers-objectyaml Author: Fangrui Song (MaskRay) ChangesThis decoder feature complements the yaml2obj encoder added by #91280. Full diff: https://github.com/llvm/llvm-project/pull/98116.diff 2 Files Affected:
diff --git a/llvm/test/tools/obj2yaml/ELF/crel-section.yaml b/llvm/test/tools/obj2yaml/ELF/crel-section.yaml
new file mode 100644
index 0000000000000..c660a397de829
--- /dev/null
+++ b/llvm/test/tools/obj2yaml/ELF/crel-section.yaml
@@ -0,0 +1,36 @@
+## Test how we dump SHT_CREL sections.
+# RUN: yaml2obj %s -o %t1
+# RUN: obj2yaml %t1 | FileCheck %s --check-prefix=YAML
+
+# YAML: - Name: .crel.dyn
+# YAML-NEXT: Type: SHT_CREL
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+Sections:
+ - Name: .crel.dyn
+ Type: SHT_CREL
+ Content: 00
+## Trigger the .dynsym emission.
+DynamicSymbols: []
+
+## Test the behavior when the sh_entsize field is broken.
+## Here we use the 0xFE value instead of expected 0x18/0x10.
+
+# RUN: yaml2obj -DTYPE=SHT_RELA --docnum=2 %s -o %t2
+# RUN: not obj2yaml %t2 2>&1 | FileCheck %s --check-prefix=ERR1
+
+# ERR1: unable to decode LEB128 at offset 0x00000000: malformed uleb128, extends past end
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+Sections:
+ - Name: .foo
+ Type: SHT_CREL
+ EntSize: 0xFE
diff --git a/llvm/tools/obj2yaml/elf2yaml.cpp b/llvm/tools/obj2yaml/elf2yaml.cpp
index 6b9af906736c3..9b4644bde36c0 100644
--- a/llvm/tools/obj2yaml/elf2yaml.cpp
+++ b/llvm/tools/obj2yaml/elf2yaml.cpp
@@ -596,6 +596,7 @@ ELFDumper<ELFT>::dumpSections() {
return [this](const Elf_Shdr *S) { return dumpSymtabShndxSection(S); };
case ELF::SHT_REL:
case ELF::SHT_RELA:
+ case ELF::SHT_CREL:
return [this](const Elf_Shdr *S) { return dumpRelocSection(S); };
case ELF::SHT_RELR:
return [this](const Elf_Shdr *S) { return dumpRelrSection(S); };
@@ -1165,27 +1166,41 @@ ELFDumper<ELFT>::dumpRelocSection(const Elf_Shdr *Shdr) {
if (Shdr->sh_size != 0)
S->Relocations.emplace();
- if (Shdr->sh_type == ELF::SHT_REL) {
- auto Rels = Obj.rels(*Shdr);
- if (!Rels)
- return Rels.takeError();
- for (const Elf_Rel &Rel : *Rels) {
- ELFYAML::Relocation R;
- if (Error E = dumpRelocation(&Rel, *SymTabOrErr, R))
- return std::move(E);
- S->Relocations->push_back(R);
- }
+ std::vector<Elf_Rel> Rels;
+ std::vector<Elf_Rela> Relas;
+ if (Shdr->sh_type == ELF::SHT_CREL) {
+ Expected<ArrayRef<uint8_t>> ContentOrErr = Obj.getSectionContents(*Shdr);
+ if (!ContentOrErr)
+ return ContentOrErr.takeError();
+ auto Crel = Obj.decodeCrel(*ContentOrErr);
+ if (!Crel)
+ return Crel.takeError();
+ Rels = std::move(Crel->first);
+ Relas = std::move(Crel->second);
+ } else if (Shdr->sh_type == ELF::SHT_REL) {
+ auto R = Obj.rels(*Shdr);
+ if (!R)
+ return R.takeError();
+ Rels = std::move(*R);
} else {
- auto Rels = Obj.relas(*Shdr);
- if (!Rels)
- return Rels.takeError();
- for (const Elf_Rela &Rel : *Rels) {
- ELFYAML::Relocation R;
- if (Error E = dumpRelocation(&Rel, *SymTabOrErr, R))
- return std::move(E);
- R.Addend = Rel.r_addend;
- S->Relocations->push_back(R);
- }
+ auto R = Obj.relas(*Shdr);
+ if (!R)
+ return R.takeError();
+ Relas = std::move(*R);
+ }
+
+ for (const Elf_Rel &Rel : Rels) {
+ ELFYAML::Relocation R;
+ if (Error E = dumpRelocation(&Rel, *SymTabOrErr, R))
+ return std::move(E);
+ S->Relocations->push_back(R);
+ }
+ for (const Elf_Rela &Rel : Relas) {
+ ELFYAML::Relocation R;
+ if (Error E = dumpRelocation(&Rel, *SymTabOrErr, R))
+ return std::move(E);
+ R.Addend = Rel.r_addend;
+ S->Relocations->push_back(R);
}
return S.release();
|
Created using spr 1.3.5-bogner
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, with one query.
- Name: unused | ||
Section: .text |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Dumb question maybe, but what's the point of this particular symbol?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The unused symbol makes symbols referenced by relocations start at higher indexes.
This property is somewhat useful to test llvm-objcopy. It's probably not so useful after decodeCrel
has been tested, but I think it does not hurt here...
This decoder feature complements the yaml2obj encoder added by llvm#91280. Pull Request: llvm#98116
This decoder feature complements the yaml2obj encoder added by #91280.