diff --git a/llvm/include/llvm/ObjectYAML/ELFYAML.h b/llvm/include/llvm/ObjectYAML/ELFYAML.h index 8f045d6383623..dfdfa055d65fa 100644 --- a/llvm/include/llvm/ObjectYAML/ELFYAML.h +++ b/llvm/include/llvm/ObjectYAML/ELFYAML.h @@ -582,6 +582,7 @@ struct VerdefEntry { std::optional Flags; std::optional VersionNdx; std::optional Hash; + std::optional VDAux; std::vector VerNames; }; diff --git a/llvm/lib/ObjectYAML/ELFEmitter.cpp b/llvm/lib/ObjectYAML/ELFEmitter.cpp index fc234581a45a7..bf19e81933cab 100644 --- a/llvm/lib/ObjectYAML/ELFEmitter.cpp +++ b/llvm/lib/ObjectYAML/ELFEmitter.cpp @@ -1655,7 +1655,7 @@ void ELFState::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; @@ -1665,13 +1665,13 @@ void ELFState::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)); } } diff --git a/llvm/lib/ObjectYAML/ELFYAML.cpp b/llvm/lib/ObjectYAML/ELFYAML.cpp index e97248cbcf568..bd816a6d704d4 100644 --- a/llvm/lib/ObjectYAML/ELFYAML.cpp +++ b/llvm/lib/ObjectYAML/ELFYAML.cpp @@ -1921,6 +1921,7 @@ void MappingTraits::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 fc3e0f7ae22d9..f082e897a6636 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]]: corrupted section: vd_aux value 100 in section verdef points past end of the section diff --git a/llvm/tools/obj2yaml/elf2yaml.cpp b/llvm/tools/obj2yaml/elf2yaml.cpp index 9b4644bde36c0..b1c8032ea2192 100644 --- a/llvm/tools/obj2yaml/elf2yaml.cpp +++ b/llvm/tools/obj2yaml/elf2yaml.cpp @@ -1451,7 +1451,15 @@ ELFDumper::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, + "corrupted section: vd_aux value " + Twine(Verdef->vd_aux) + + " in section verdef points past end of the section"); while (BufAux) { const Elf_Verdaux *Verdaux = reinterpret_cast(BufAux);