[yaml2obj] - Do not ignore explicit addresses for .dynsym and .dynstr

This fixes https://bugs.llvm.org/show_bug.cgi?id=40339

Previously if the addresses were set in YAML they were ignored for
.dynsym and .dynstr sections. The patch fixes that.

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

llvm-svn: 354318
This commit is contained in:
George Rimar 2019-02-19 12:15:04 +00:00
parent 55d41a78ac
commit 6947acd9da
2 changed files with 58 additions and 0 deletions

View File

@ -0,0 +1,40 @@
# RUN: yaml2obj %s -o %t
# RUN: llvm-readobj -sections %t | FileCheck %s
## Check yaml2obj does not ignore the address of the
## explicitly listed .dynstr and .dynsym sections.
# CHECK: Name: .dynstr
# CHECK-NEXT: Type: SHT_STRTAB
# CHECK-NEXT: Flags [
# CHECK-NEXT: SHF_ALLOC
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x1000
# CHECK: Name: .dynsym
# CHECK-NEXT: Type: SHT_DYNSYM
# CHECK-NEXT: Flags [
# CHECK-NEXT: SHF_ALLOC
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x2000
!ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_X86_64
Sections:
- Name: .dynstr
Type: SHT_STRTAB
Flags: [ SHF_ALLOC ]
Address: 0x1000
EntSize: 0x1
- Name: .dynsym
Type: SHT_DYNSYM
Flags: [ SHF_ALLOC ]
Address: 0x2000
EntSize: 0x18
DynamicSymbols:
Global:
- Name: foo

View File

@ -321,6 +321,15 @@ void ELFState<ELFT>::initSymtabSectionHeader(Elf_Shdr &SHeader,
SHeader.sh_entsize = sizeof(Elf_Sym);
SHeader.sh_addralign = 8;
// If .dynsym section is explicitly described in the YAML
// then we want to use its section address.
if (!IsStatic) {
// Take section index and ignore the SHT_NULL section.
unsigned SecNdx = getDotDynSymSecNo() - 1;
if (SecNdx < Doc.Sections.size())
SHeader.sh_addr = Doc.Sections[SecNdx]->Address;
}
std::vector<Elf_Sym> Syms;
{
// Ensure STN_UNDEF is present
@ -358,6 +367,15 @@ void ELFState<ELFT>::initStrtabSectionHeader(Elf_Shdr &SHeader, StringRef Name,
STB.write(CBA.getOSAndAlignedOffset(SHeader.sh_offset, SHeader.sh_addralign));
SHeader.sh_size = STB.getSize();
SHeader.sh_addralign = 1;
// If .dynstr section is explicitly described in the YAML
// then we want to use its section address.
if (Name == ".dynstr") {
// Take section index and ignore the SHT_NULL section.
unsigned SecNdx = getDotDynStrSecNo() - 1;
if (SecNdx < Doc.Sections.size())
SHeader.sh_addr = Doc.Sections[SecNdx]->Address;
}
}
template <class ELFT>