]> granicus.if.org Git - llvm/commitdiff
[yaml2obj] - Allow overriding sh_entsize for SHT_GNU_versym sections.
authorGeorge Rimar <grimar@accesssoftek.com>
Mon, 5 Aug 2019 13:54:35 +0000 (13:54 +0000)
committerGeorge Rimar <grimar@accesssoftek.com>
Mon, 5 Aug 2019 13:54:35 +0000 (13:54 +0000)
This allows to write a test case for one of untested errors
in llvm/Object/ELF.h.

I did it in this patch to demonstrate.

Differential revision: https://reviews.llvm.org/D65394

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@367860 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Object/ELF.h
test/Object/invalid.test
test/tools/yaml2obj/versym-section.yaml
tools/yaml2obj/yaml2elf.cpp

index aa0864edb78bcf14ab8350022e5b0c283b3fbad2..6febbc7c8ded3431997b44992fd25deb698a93d9 100644 (file)
@@ -547,8 +547,9 @@ template <typename T>
 Expected<const T *> ELFFile<ELFT>::getEntry(const Elf_Shdr *Section,
                                             uint32_t Entry) const {
   if (sizeof(T) != Section->sh_entsize)
-    // TODO: this error is untested.
-    return createError("invalid sh_entsize");
+    return createError("section " + getSecIndexForError(this, Section) +
+                       " has invalid sh_entsize: expected " + Twine(sizeof(T)) +
+                       ", but got " + Twine(Section->sh_entsize));
   size_t Pos = Section->sh_offset + Entry * sizeof(T);
   if (Pos + sizeof(T) > Buf.size())
     return createError("unable to access section " +
index 7071dee98eb6037638e8bf1ba30cf6b72584282a..04a332d5fa4a6e81eadc0322da537e33a18f1fcb 100644 (file)
@@ -627,3 +627,28 @@ Sections:
     Content: ""
 Symbols:
   - Name: foo
+
+## Check that we report an error if SHT_GNU_versym has invalid
+## sh_entsize value (3 instead of 2) when trying to access the entries.
+
+# RUN: yaml2obj %s --docnum=30 -o %t30
+# RUN: not llvm-readobj -V %t30 2>&1 | FileCheck --check-prefix=INVALID-VER-SHENTSIZE %s
+
+# INVALID-VER-SHENTSIZE: error: section [index 1] has invalid sh_entsize: expected 2, but got 3
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  OSABI:   ELFOSABI_FREEBSD
+  Type:    ET_DYN
+  Machine: EM_X86_64
+Sections:
+  - Name:    .gnu.version
+    Type:    SHT_GNU_versym
+    EntSize: 0x0000000000000003
+    Entries: [ ]
+## Needed to trigger creation of .dynsym.
+DynamicSymbols:
+  - Name:    foo
+    Binding: STB_GLOBAL
index fa28ae569b6846cf07aa40127b86851f4abb6d10..6e0cecba19e224bf238f2e1ffd1ef341b2866516 100644 (file)
@@ -1,9 +1,9 @@
-# RUN: yaml2obj %s -o %t
-# RUN: llvm-readobj -V %t | FileCheck %s
-
 ## Check we are able to produce a valid SHT_GNU_versym
 ## section from its description.
 
+# RUN: yaml2obj --docnum=1 %s -o %t1
+# RUN: llvm-readobj -V %t1 | FileCheck %s
+
 # CHECK:      Version symbols {
 # CHECK-NEXT:   Section Name: .gnu.version
 # CHECK-NEXT:   Address: 0x200210
@@ -89,3 +89,25 @@ DynamicSymbols:
   - Name:    f2
     Binding: STB_GLOBAL
 ...
+
+## Check we are able to set custom sh_entsize field for SHT_GNU_versym section.
+
+# RUN: yaml2obj --docnum=2 %s -o %t2
+# RUN: llvm-readelf -S %t2 | FileCheck %s --check-prefix=ENTSIZE
+
+# ENTSIZE: Section Headers:
+# ENTSIZE:   [Nr] Name         Type   Address          Off    Size   ES
+# ENTSIZE:   [ 1] .gnu.version VERSYM 0000000000000000 000180 000000 03
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  OSABI:   ELFOSABI_FREEBSD
+  Type:    ET_DYN
+  Machine: EM_X86_64
+Sections:
+  - Name:    .gnu.version
+    Type:    SHT_GNU_versym
+    EntSize: 0x0000000000000003
+    Entries: [ ]
index e11d8fe3ff035e72d47bc763ab81846da2cd1b88..bcb390bb5e1cba581161341d79460091cf67c467 100644 (file)
@@ -796,7 +796,7 @@ bool ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
   for (uint16_t Version : Section.Entries)
     support::endian::write<uint16_t>(OS, Version, ELFT::TargetEndianness);
 
-  SHeader.sh_entsize = 2;
+  SHeader.sh_entsize = Section.EntSize ? (uint64_t)*Section.EntSize : 2;
   SHeader.sh_size = Section.Entries.size() * SHeader.sh_entsize;
   return true;
 }