[llvm] [obj2yaml] Support CREL (PR #98116)
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 8 23:21:33 PDT 2024
https://github.com/MaskRay created https://github.com/llvm/llvm-project/pull/98116
This decoder feature complements the yaml2obj encoder added by #91280.
>From e5a51e699052deccd12c330cb57ee1decd81da3b Mon Sep 17 00:00:00 2001
From: Fangrui Song <i at maskray.me>
Date: Mon, 8 Jul 2024 23:21:24 -0700
Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?=
=?UTF-8?q?l=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.5-bogner
---
.../test/tools/obj2yaml/ELF/crel-section.yaml | 36 ++++++++++++
llvm/tools/obj2yaml/elf2yaml.cpp | 55 ++++++++++++-------
2 files changed, 71 insertions(+), 20 deletions(-)
create mode 100644 llvm/test/tools/obj2yaml/ELF/crel-section.yaml
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();
More information about the llvm-commits
mailing list