From abc1500538a9ddeef9ec664630b8509f48910637 Mon Sep 17 00:00:00 2001 From: George Rimar Date: Fri, 14 Jun 2019 11:13:32 +0000 Subject: [PATCH] [yaml2obj] - Allow setting the custom Address for .strtab Despite the fact that .strtab is non-allocatable, there is no reason to disallow setting the custom address for it. The patch also adds a test case showing we can set any address we want for other implicit sections. Differential revision: https://reviews.llvm.org/D63137 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@363368 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/tools/yaml2obj/dynsym-dynstr-addr.yaml | 40 ------------- .../yaml2obj/implicit-sections-addr.yaml | 57 +++++++++++++++++++ tools/yaml2obj/yaml2elf.cpp | 5 +- 3 files changed, 59 insertions(+), 43 deletions(-) delete mode 100644 test/tools/yaml2obj/dynsym-dynstr-addr.yaml create mode 100644 test/tools/yaml2obj/implicit-sections-addr.yaml diff --git a/test/tools/yaml2obj/dynsym-dynstr-addr.yaml b/test/tools/yaml2obj/dynsym-dynstr-addr.yaml deleted file mode 100644 index 194c5e5deb3..00000000000 --- a/test/tools/yaml2obj/dynsym-dynstr-addr.yaml +++ /dev/null @@ -1,40 +0,0 @@ -# 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: - - Name: foo - Binding: STB_GLOBAL diff --git a/test/tools/yaml2obj/implicit-sections-addr.yaml b/test/tools/yaml2obj/implicit-sections-addr.yaml new file mode 100644 index 00000000000..8151daed1d6 --- /dev/null +++ b/test/tools/yaml2obj/implicit-sections-addr.yaml @@ -0,0 +1,57 @@ +# RUN: yaml2obj %s -o %t +# RUN: llvm-readobj --sections %t | FileCheck %s + +## Check yaml2obj does not ignore the address of the +## explicitly listed .dynstr, .dynsym, .strtab +## and .symtab 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 + +# CHECK: Name: .strtab +# CHECK-NEXT: Type: SHT_STRTAB +# CHECK-NEXT: Flags [ +# CHECK-NEXT: ] +# CHECK-NEXT: Address: 0x3000 + +# CHECK: Name: .symtab +# CHECK-NEXT: Type: SHT_SYMTAB +# CHECK-NEXT: Flags [ +# CHECK-NEXT: ] +# CHECK-NEXT: Address: 0x4000 + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .dynstr + Type: SHT_STRTAB + Flags: [ SHF_ALLOC ] + Address: 0x1000 + - Name: .dynsym + Type: SHT_DYNSYM + Flags: [ SHF_ALLOC ] + Address: 0x2000 + - Name: .strtab + Type: SHT_STRTAB + Address: 0x3000 + - Name: .symtab + Type: SHT_SYMTAB + Address: 0x4000 +DynamicSymbols: + - Name: foo + Binding: STB_GLOBAL diff --git a/tools/yaml2obj/yaml2elf.cpp b/tools/yaml2obj/yaml2elf.cpp index cd61561dc7f..098c3d6f6bf 100644 --- a/tools/yaml2obj/yaml2elf.cpp +++ b/tools/yaml2obj/yaml2elf.cpp @@ -489,10 +489,9 @@ void ELFState::initStrtabSectionHeader(Elf_Shdr &SHeader, StringRef Name, else if (Name == ".dynstr") SHeader.sh_flags = ELF::SHF_ALLOC; - // If .dynstr section is explicitly described in the YAML + // If the section is explicitly described in the YAML // then we want to use its section address. - // TODO: Allow this for any explicitly described section. - if (YAMLSec && Name == ".dynstr") + if (YAMLSec) SHeader.sh_addr = YAMLSec->Address; }