mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-19 23:23:38 -04:00
[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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353636 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -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
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user