[yaml2obj] - Fix .dynamic section entries writing for 32bit targets.
authorGeorge Rimar <grimar@accesssoftek.com>
Sun, 10 Feb 2019 08:35:38 +0000 (08:35 +0000)
committerGeorge Rimar <grimar@accesssoftek.com>
Sun, 10 Feb 2019 08:35:38 +0000 (08:35 +0000)
This was introduced by me in r353613.

I tried to fix Big-endian bot and replaced
uintX_t -> ELFT::Xword. But ELFT::Xword is a packed<uint64_t>,
so it is always 8 bytes and that was obviously incorrect.

My intention was to use something like packed<uint> actually, which
size is target dependent.

Patch fixes this bug and adds a test case, since no bots seems reported this.

llvm-svn: 353636

llvm/test/tools/yaml2obj/dynamic-section-i386.test [new file with mode: 0644]
llvm/tools/yaml2obj/yaml2elf.cpp

diff --git a/llvm/test/tools/yaml2obj/dynamic-section-i386.test b/llvm/test/tools/yaml2obj/dynamic-section-i386.test
new file mode 100644 (file)
index 0000000..89f7de6
--- /dev/null
@@ -0,0 +1,43 @@
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-readobj %t --dynamic-table | FileCheck %s
+
+## Check we write a valid .dynamic section values when emiting a 32-bit object.
+
+# CHECK:      DynamicSection [ (2 entries)
+# CHECK-NEXT:   Tag        Type                 Name/Value
+# CHECK-NEXT:   0x0000000A STRSZ                1 (bytes)
+# CHECK-NEXT:   0x00000000 NULL                 0x0
+# CHECK-NEXT: ]
+
+!ELF
+FileHeader:
+  Class:           ELFCLASS32
+  Data:            ELFDATA2LSB
+  Type:            ET_DYN
+  Machine:         EM_386
+Sections:
+  - Name:            .dynamic
+    Type:            SHT_DYNAMIC
+    Flags:           [ SHF_ALLOC ]
+    Address:         0x0000000000000008
+    AddressAlign:    0x0000000000000008
+    EntSize:         0x0000000000000010
+    Entries:
+      - Tag:             DT_STRSZ
+        Value:           0x0000000000000001
+      - Tag:             DT_NULL
+        Value:           0x0000000000000000
+ProgramHeaders:
+  - Type: PT_LOAD
+    Flags: [ PF_R ]
+    VAddr: 0x0000
+    PAddr: 0x0000
+    Align: 8
+    Sections:
+      - Section: .dynamic
+  - Type: PT_DYNAMIC
+    Flags: [ PF_X, PF_R ]
+    VAddr: 0x0008
+    PAddr: 0x0008
+    Sections:
+      - Section: .dynamic
index d5b1b59..c904523 100644 (file)
@@ -582,11 +582,11 @@ template <class ELFT>
 void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
                                          const ELFYAML::DynamicSection &Section,
                                          ContiguousBlobAccumulator &CBA) {
-  typedef typename ELFT::Xword Xword;
+  typedef typename ELFT::Addr Elf_Addr;
   assert(Section.Type == llvm::ELF::SHT_DYNAMIC &&
          "Section type is not SHT_DYNAMIC");
 
-  SHeader.sh_size = 2 * sizeof(typename ELFT::uint) * Section.Entries.size();
+  SHeader.sh_size = 2 * sizeof(Elf_Addr) * Section.Entries.size();
   if (Section.EntSize)
     SHeader.sh_entsize = *Section.EntSize;
   else
@@ -594,10 +594,10 @@ void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
 
   auto &OS = CBA.getOSAndAlignedOffset(SHeader.sh_offset, SHeader.sh_addralign);
   for (const ELFYAML::DynamicEntry &DE : Section.Entries) {
-    Xword Tag = (Xword)DE.Tag;
-    OS.write((const char *)&Tag, sizeof(Xword));
-    Xword Val = (Xword)DE.Val;
-    OS.write((const char *)&Val, sizeof(Xword));
+    Elf_Addr Tag = (Elf_Addr)DE.Tag;
+    OS.write((const char *)&Tag, sizeof(Elf_Addr));
+    Elf_Addr Val = (Elf_Addr)DE.Val;
+    OS.write((const char *)&Val, sizeof(Elf_Addr));
   }
 }