From: George Rimar Date: Sun, 10 Feb 2019 08:35:38 +0000 (+0000) Subject: [yaml2obj] - Fix .dynamic section entries writing for 32bit targets. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7966ea2610475a2ba220c4bbf9b680e8567f6851;p=llvm [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, so it is always 8 bytes and that was obviously incorrect. My intention was to use something like packed actually, which size is target dependent. Patch fixes this bug and adds a test case, since no bots seems reported this. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353636 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/tools/yaml2obj/dynamic-section-i386.test b/test/tools/yaml2obj/dynamic-section-i386.test new file mode 100644 index 00000000000..89f7de6fd76 --- /dev/null +++ b/test/tools/yaml2obj/dynamic-section-i386.test @@ -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 diff --git a/tools/yaml2obj/yaml2elf.cpp b/tools/yaml2obj/yaml2elf.cpp index d5b1b59c254..c904523f4c9 100644 --- a/tools/yaml2obj/yaml2elf.cpp +++ b/tools/yaml2obj/yaml2elf.cpp @@ -582,11 +582,11 @@ template void ELFState::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::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)); } }