From b728126619f62cbff7c8dfeba905fecf41264085 Mon Sep 17 00:00:00 2001 From: George Rimar Date: Fri, 14 Jun 2019 14:25:34 +0000 Subject: [PATCH] Revert "Revert r363377: [yaml2obj] - Allow setting custom section types for implicit sections." LLD test case will be fixed in a following commit. Original commit message: [yaml2obj] - Allow setting custom section types for implicit sections. We were hardcoding the final section type for sections that are usually implicit. The patch fixes that. This also fixes a few issues in existent test cases and removes one precompiled object. Differential revision: https://reviews.llvm.org/D63267 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@363401 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Inputs/wrong-shstrtab-type.elf-x86-64 | Bin 541 -> 0 bytes .../llvm-readobj/elf-wrong-shstrtab-type.test | 21 ++++-- test/tools/yaml2obj/elf-symtab-shinfo.yaml | 20 ++--- test/tools/yaml2obj/elf-symtab-shtype.yaml | 20 +++-- .../yaml2obj/explicit-dynsym-no-dynstr.yaml | 2 +- .../yaml2obj/implicit-sections-types.test | 69 ++++++++++++++++++ .../symtab-implicit-sections-flags.yaml | 4 +- tools/yaml2obj/yaml2elf.cpp | 8 +- 8 files changed, 113 insertions(+), 31 deletions(-) delete mode 100644 test/tools/llvm-readobj/Inputs/wrong-shstrtab-type.elf-x86-64 create mode 100644 test/tools/yaml2obj/implicit-sections-types.test diff --git a/test/tools/llvm-readobj/Inputs/wrong-shstrtab-type.elf-x86-64 b/test/tools/llvm-readobj/Inputs/wrong-shstrtab-type.elf-x86-64 deleted file mode 100644 index 801a21be823f14bc3744f251cc42cba58368e692..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 541 zcmb<-^>JfjWMqH=W(GS31doBi0V)BbL0kt03oyyXzzpJ21eAfgk?n&Sb^t0U0Tp0^ zNkD0sxHOQDP5%w3AT~Kc#OR3B&E-7LF)0Mdldc_$)Zb@PikOiYFb3uHZ0070s6(s-w diff --git a/test/tools/llvm-readobj/elf-wrong-shstrtab-type.test b/test/tools/llvm-readobj/elf-wrong-shstrtab-type.test index 2d5fd68cd57..ce7fec67c0b 100644 --- a/test/tools/llvm-readobj/elf-wrong-shstrtab-type.test +++ b/test/tools/llvm-readobj/elf-wrong-shstrtab-type.test @@ -1,11 +1,22 @@ -## wrong-shstrtab-type.elf-x86-64 contains .shstrtab section which has SHT_PROGBITS type. -## Check we do not fail to dump the section headers in this case. +## Check we do not fail to dump the section headers when +## a .shstrtab section does not have a SHT_STRTAB type. -# RUN: llvm-readobj -S %p/Inputs/wrong-shstrtab-type.elf-x86-64 | FileCheck %s --check-prefix LLVM -# RUN: llvm-readelf -S %p/Inputs/wrong-shstrtab-type.elf-x86-64 | FileCheck %s --check-prefix GNU +# RUN: yaml2obj %s -o %t1 +# RUN: llvm-readobj -S %t1 | FileCheck %s --check-prefix LLVM +# RUN: llvm-readelf -S %t1 | FileCheck %s --check-prefix GNU # LLVM: Name: .shstrtab # LLVM-NEXT: Type: SHT_PROGBITS # GNU: [Nr] Name Type -# GNU: [ 3] .shstrtab PROGBITS +# GNU: [ 1] .shstrtab PROGBITS + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .shstrtab + Type: SHT_PROGBITS diff --git a/test/tools/yaml2obj/elf-symtab-shinfo.yaml b/test/tools/yaml2obj/elf-symtab-shinfo.yaml index 50c0b6c9c55..98ab4ac30db 100644 --- a/test/tools/yaml2obj/elf-symtab-shinfo.yaml +++ b/test/tools/yaml2obj/elf-symtab-shinfo.yaml @@ -24,17 +24,17 @@ --- !ELF FileHeader: - Class: ELFCLASS64 - Data: ELFDATA2LSB - Type: ET_REL - Machine: EM_X86_64 + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 Sections: - - Name: .symtab - Info: 42 - Type: SHT_SYMTAB - - Name: .dynsym - Info: 26 - Type: SHT_SYMTAB + - Name: .symtab + Info: 42 + Type: SHT_SYMTAB + - Name: .dynsym + Info: 26 + Type: SHT_DYNSYM Symbols: - Name: foo Binding: STB_GLOBAL diff --git a/test/tools/yaml2obj/elf-symtab-shtype.yaml b/test/tools/yaml2obj/elf-symtab-shtype.yaml index 558ec8c6da4..fff18607dca 100644 --- a/test/tools/yaml2obj/elf-symtab-shtype.yaml +++ b/test/tools/yaml2obj/elf-symtab-shtype.yaml @@ -2,20 +2,18 @@ # RUN: yaml2obj %s -o %t # RUN: llvm-readobj --sections %t | FileCheck %s -## TODO: the output is still SHT_SYMTAB because we do not yet -## support changing it. # CHECK: Name: .symtab -# CHECK-NEXT: Type: SHT_SYMTAB +# CHECK-NEXT: Type: SHT_DYNAMIC --- !ELF -FileHeader: - Class: ELFCLASS64 - Data: ELFDATA2LSB - Type: ET_REL - Machine: EM_X86_64 -Sections: - - Name: .symtab - Type: SHT_DYNAMIC +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .symtab + Type: SHT_DYNAMIC Symbols: - Name: foo Binding: STB_GLOBAL diff --git a/test/tools/yaml2obj/explicit-dynsym-no-dynstr.yaml b/test/tools/yaml2obj/explicit-dynsym-no-dynstr.yaml index 53f6d216ba4..88b2a4da63b 100644 --- a/test/tools/yaml2obj/explicit-dynsym-no-dynstr.yaml +++ b/test/tools/yaml2obj/explicit-dynsym-no-dynstr.yaml @@ -19,4 +19,4 @@ FileHeader: Machine: EM_X86_64 Sections: - Name: .dynsym - Type: SHT_SYMTAB + Type: SHT_DYNSYM diff --git a/test/tools/yaml2obj/implicit-sections-types.test b/test/tools/yaml2obj/implicit-sections-types.test new file mode 100644 index 00000000000..8360fa73d82 --- /dev/null +++ b/test/tools/yaml2obj/implicit-sections-types.test @@ -0,0 +1,69 @@ +## Here we check the types set for implicit sections +## in different cases. + +## Check the types set by default in case sections were implicitly +## added and not described in the YAML. + +# RUN: yaml2obj --docnum=1 %s -o %t1 +# RUN: llvm-readobj -S %t1 | FileCheck %s --check-prefix=CASE1 + +# CASE1: Name: .symtab +# CASE1-NEXT: Type: SHT_SYMTAB +# CASE1: Name: .strtab +# CASE1-NEXT: Type: SHT_STRTAB +# CASE1: Name: .shstrtab +# CASE1-NEXT: Type: SHT_STRTAB +# CASE1: Name: .dynsym +# CASE1-NEXT: Type: SHT_DYNSYM +# CASE1: Name: .dynstr +# CASE1-NEXT: Type: SHT_STRTAB + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +## Needed to force the creation of the .dynsym and .dynstr. +DynamicSymbols: + - Name: foo + - Binding: STB_GLOBAL + +## Check we can set any arbitrary types when describing sections +## that are usually implicit. + +# RUN: yaml2obj --docnum=2 %s -o %t2 +# RUN: llvm-readobj -S %t2 | FileCheck %s --check-prefix=CASE2 + +# CASE2: Name: .symtab +# CASE2-NEXT: Type: SHT_DYNAMIC +# CASE2: Name: .strtab +# CASE2-NEXT: Type: SHT_RELA +# CASE2: Name: .shstrtab +# CASE2-NEXT: Type: SHT_PROGBITS +# CASE2: Name: .dynsym +# CASE2-NEXT: Type: SHT_NOTE +# CASE2: Name: .dynstr +# CASE2-NEXT: Type: SHT_NOBITS + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .symtab + Type: SHT_DYNAMIC + - Name: .strtab + Type: SHT_RELA + - Name: .shstrtab + Type: SHT_PROGBITS + - Name: .dynsym + Type: SHT_NOTE + - Name: .dynstr + Type: SHT_NOBITS +## Needed to set the proper content size for .symtab, so +## that llvm-readobj can dump this section. +Symbols: + - Name: foo diff --git a/test/tools/yaml2obj/symtab-implicit-sections-flags.yaml b/test/tools/yaml2obj/symtab-implicit-sections-flags.yaml index 750b0ca0a5b..55ea02ab883 100644 --- a/test/tools/yaml2obj/symtab-implicit-sections-flags.yaml +++ b/test/tools/yaml2obj/symtab-implicit-sections-flags.yaml @@ -27,7 +27,7 @@ Sections: - Name: .symtab Type: SHT_SYMTAB - Name: .dynsym - Type: SHT_SYMTAB + Type: SHT_DYNSYM ## Check we can set arbitrary flags for .symtab/.dynsym. @@ -57,7 +57,7 @@ Sections: Type: SHT_SYMTAB Flags: [ SHF_ALLOC, SHF_STRINGS ] - Name: .dynsym - Type: SHT_SYMTAB + Type: SHT_DYNSYM Flags: [ SHF_STRINGS ] ## Check no flags are set by default for .symtab when it is not diff --git a/tools/yaml2obj/yaml2elf.cpp b/tools/yaml2obj/yaml2elf.cpp index 098c3d6f6bf..8e4ea786c85 100644 --- a/tools/yaml2obj/yaml2elf.cpp +++ b/tools/yaml2obj/yaml2elf.cpp @@ -403,7 +403,11 @@ void ELFState::initSymtabSectionHeader(Elf_Shdr &SHeader, zero(SHeader); SHeader.sh_name = DotShStrtab.getOffset(IsStatic ? ".symtab" : ".dynsym"); - SHeader.sh_type = IsStatic ? ELF::SHT_SYMTAB : ELF::SHT_DYNSYM; + + if (YAMLSec) + SHeader.sh_type = YAMLSec->Type; + else + SHeader.sh_type = IsStatic ? ELF::SHT_SYMTAB : ELF::SHT_DYNSYM; if (RawSec && !RawSec->Link.empty()) { // If the Link field is explicitly defined in the document, @@ -467,7 +471,7 @@ void ELFState::initStrtabSectionHeader(Elf_Shdr &SHeader, StringRef Name, ELFYAML::Section *YAMLSec) { zero(SHeader); SHeader.sh_name = DotShStrtab.getOffset(Name); - SHeader.sh_type = ELF::SHT_STRTAB; + SHeader.sh_type = YAMLSec ? YAMLSec->Type : ELF::SHT_STRTAB; SHeader.sh_addralign = YAMLSec ? (uint64_t)YAMLSec->AddressAlign : 1; ELFYAML::RawContentSection *RawSec =