[llvm] [ObjectYAML][ELF] Allow verdaux entry offset to be user-defined (PR #115343)
Antonio Frighetto via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 7 09:12:48 PST 2024
https://github.com/antoniofrighetto created https://github.com/llvm/llvm-project/pull/115343
Allow verdaux entry offset to be user-defined. First commit to be landed separately.
>From 94c4f21da687228678c4d09c793296850d7fbd28 Mon Sep 17 00:00:00 2001
From: Antonio Frighetto <me at antoniofrighetto.com>
Date: Thu, 7 Nov 2024 15:00:16 +0100
Subject: [PATCH 1/2] [ObjectYAML][ELF] Fix misspelling in `Elf_Verdaux` var
name (NFC)
---
llvm/lib/ObjectYAML/ELFEmitter.cpp | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/llvm/lib/ObjectYAML/ELFEmitter.cpp b/llvm/lib/ObjectYAML/ELFEmitter.cpp
index fc234581a45a70..a449b18143f92b 100644
--- a/llvm/lib/ObjectYAML/ELFEmitter.cpp
+++ b/llvm/lib/ObjectYAML/ELFEmitter.cpp
@@ -1665,13 +1665,13 @@ void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
CBA.write((const char *)&VerDef, sizeof(Elf_Verdef));
for (size_t J = 0; J < E.VerNames.size(); ++J, ++AuxCnt) {
- Elf_Verdaux VernAux;
- VernAux.vda_name = DotDynstr.getOffset(E.VerNames[J]);
+ Elf_Verdaux VerdAux;
+ VerdAux.vda_name = DotDynstr.getOffset(E.VerNames[J]);
if (J == E.VerNames.size() - 1)
- VernAux.vda_next = 0;
+ VerdAux.vda_next = 0;
else
- VernAux.vda_next = sizeof(Elf_Verdaux);
- CBA.write((const char *)&VernAux, sizeof(Elf_Verdaux));
+ VerdAux.vda_next = sizeof(Elf_Verdaux);
+ CBA.write((const char *)&VerdAux, sizeof(Elf_Verdaux));
}
}
>From 9666bbc875fa28697b39deb28b4b99c42793b1ff Mon Sep 17 00:00:00 2001
From: Antonio Frighetto <me at antoniofrighetto.com>
Date: Thu, 7 Nov 2024 10:26:39 +0100
Subject: [PATCH 2/2] [ObjectYAML][ELF] Allow verdaux entry offset to be
user-defined
---
llvm/include/llvm/ObjectYAML/ELFYAML.h | 1 +
llvm/lib/ObjectYAML/ELFEmitter.cpp | 2 +-
llvm/lib/ObjectYAML/ELFYAML.cpp | 1 +
llvm/test/tools/obj2yaml/ELF/verdef-section.yaml | 8 ++++++++
llvm/tools/obj2yaml/elf2yaml.cpp | 8 ++++++++
5 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/llvm/include/llvm/ObjectYAML/ELFYAML.h b/llvm/include/llvm/ObjectYAML/ELFYAML.h
index 8f045d6383623b..dfdfa055d65fa6 100644
--- a/llvm/include/llvm/ObjectYAML/ELFYAML.h
+++ b/llvm/include/llvm/ObjectYAML/ELFYAML.h
@@ -582,6 +582,7 @@ struct VerdefEntry {
std::optional<uint16_t> Flags;
std::optional<uint16_t> VersionNdx;
std::optional<uint32_t> Hash;
+ std::optional<uint16_t> VDAux;
std::vector<StringRef> VerNames;
};
diff --git a/llvm/lib/ObjectYAML/ELFEmitter.cpp b/llvm/lib/ObjectYAML/ELFEmitter.cpp
index a449b18143f92b..bf19e81933cab7 100644
--- a/llvm/lib/ObjectYAML/ELFEmitter.cpp
+++ b/llvm/lib/ObjectYAML/ELFEmitter.cpp
@@ -1655,7 +1655,7 @@ void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
VerDef.vd_flags = E.Flags.value_or(0);
VerDef.vd_ndx = E.VersionNdx.value_or(0);
VerDef.vd_hash = E.Hash.value_or(0);
- VerDef.vd_aux = sizeof(Elf_Verdef);
+ VerDef.vd_aux = E.VDAux.value_or(sizeof(Elf_Verdef));
VerDef.vd_cnt = E.VerNames.size();
if (I == Section.Entries->size() - 1)
VerDef.vd_next = 0;
diff --git a/llvm/lib/ObjectYAML/ELFYAML.cpp b/llvm/lib/ObjectYAML/ELFYAML.cpp
index e97248cbcf5682..bd816a6d704d44 100644
--- a/llvm/lib/ObjectYAML/ELFYAML.cpp
+++ b/llvm/lib/ObjectYAML/ELFYAML.cpp
@@ -1921,6 +1921,7 @@ void MappingTraits<ELFYAML::VerdefEntry>::mapping(IO &IO,
IO.mapOptional("Flags", E.Flags);
IO.mapOptional("VersionNdx", E.VersionNdx);
IO.mapOptional("Hash", E.Hash);
+ IO.mapOptional("VDAux", E.VDAux);
IO.mapRequired("Names", E.VerNames);
}
diff --git a/llvm/test/tools/obj2yaml/ELF/verdef-section.yaml b/llvm/test/tools/obj2yaml/ELF/verdef-section.yaml
index fc3e0f7ae22d9c..0eb81d7cfffab4 100644
--- a/llvm/test/tools/obj2yaml/ELF/verdef-section.yaml
+++ b/llvm/test/tools/obj2yaml/ELF/verdef-section.yaml
@@ -48,12 +48,14 @@ Sections:
Flags: 0
VersionNdx: 0
Hash: 0
+ VDAux: 20
Names:
- VERSION_0
## An entry with arbitrary values.
- Flags: 2
VersionNdx: 2
Hash: 108387921
+ VDAux: [[VDAUX=20]]
Names:
- VERSION_1
## Another entry with arbitrary values and version predecessors.
@@ -81,3 +83,9 @@ DynamicSymbols: []
# RUN: FileCheck %s -DFILE=%t.version --check-prefix=VERSION-ERR
# VERSION-ERR: Error reading file: [[FILE]]: invalid SHT_GNU_verdef section version: 2
+
+# RUN: yaml2obj %s -DVDAUX=100 -o %t.vdaux
+# RUN: not obj2yaml %t.vdaux 2>&1 | \
+# RUN: FileCheck %s -DFILE=%t.vdaux --check-prefix=VDAUX-ERR
+
+# VDAUX-ERR: Error reading file: [[FILE]]: vd_aux value 100 in section verdef points past end of the section, corrupted section
diff --git a/llvm/tools/obj2yaml/elf2yaml.cpp b/llvm/tools/obj2yaml/elf2yaml.cpp
index 9b4644bde36c0b..111e25294fa5ba 100644
--- a/llvm/tools/obj2yaml/elf2yaml.cpp
+++ b/llvm/tools/obj2yaml/elf2yaml.cpp
@@ -1451,7 +1451,15 @@ ELFDumper<ELFT>::dumpVerdefSection(const Elf_Shdr *Shdr) {
if (Verdef->vd_hash != 0)
Entry.Hash = Verdef->vd_hash;
+ if (Verdef->vd_aux != sizeof(Elf_Verdef))
+ Entry.VDAux = Verdef->vd_aux;
+
const uint8_t *BufAux = Buf + Verdef->vd_aux;
+ if (BufAux > Data.end())
+ return createStringError(errc::invalid_argument,
+ "vd_aux value " + Twine(Verdef->vd_aux) +
+ " in section verdef points past end of the "
+ "section, corrupted section");
while (BufAux) {
const Elf_Verdaux *Verdaux =
reinterpret_cast<const Elf_Verdaux *>(BufAux);
More information about the llvm-commits
mailing list