[llvm] r353636 - [yaml2obj] - Fix .dynamic section entries writing for 32bit targets.
George Rimar via llvm-commits
llvm-commits at lists.llvm.org
Sun Feb 10 00:35:39 PST 2019
Author: grimar
Date: Sun Feb 10 00:35:38 2019
New Revision: 353636
URL: http://llvm.org/viewvc/llvm-project?rev=353636&view=rev
Log:
[yaml2obj] - Fix .dynamic section entries writing for 32bit targets.
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.
Added:
llvm/trunk/test/tools/yaml2obj/dynamic-section-i386.test
Modified:
llvm/trunk/tools/yaml2obj/yaml2elf.cpp
Added: llvm/trunk/test/tools/yaml2obj/dynamic-section-i386.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/yaml2obj/dynamic-section-i386.test?rev=353636&view=auto
==============================================================================
--- llvm/trunk/test/tools/yaml2obj/dynamic-section-i386.test (added)
+++ llvm/trunk/test/tools/yaml2obj/dynamic-section-i386.test Sun Feb 10 00:35:38 2019
@@ -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
Modified: llvm/trunk/tools/yaml2obj/yaml2elf.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2elf.cpp?rev=353636&r1=353635&r2=353636&view=diff
==============================================================================
--- llvm/trunk/tools/yaml2obj/yaml2elf.cpp (original)
+++ llvm/trunk/tools/yaml2obj/yaml2elf.cpp Sun Feb 10 00:35:38 2019
@@ -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
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));
}
}
More information about the llvm-commits
mailing list