From 5b118a0471435751f39eeb92d56ecc3956053304 Mon Sep 17 00:00:00 2001 From: Georgii Rymar Date: Mon, 28 Oct 2019 13:30:05 +0300 Subject: [PATCH] [yaml2obj] - Improve handling of the SHT_GROUP section. Currently, when we do not specify "Info" field in a YAML description for SHT_GROUP section, yaml2obj reports an error: "error: unknown symbol referenced: '' by YAML section '.group1'" Also, we do not link it with a symbol table by default, though it is what we do for AddrsigSection, HashSection, RelocationSection. (http://www.sco.com/developers/gabi/latest/ch4.sheader.html#sh_link) The patch fixes missings mentioned. Differential revision: https://reviews.llvm.org/D69299 --- llvm/include/llvm/ObjectYAML/ELFYAML.h | 2 +- llvm/lib/ObjectYAML/ELFEmitter.cpp | 10 +++- llvm/lib/ObjectYAML/ELFYAML.cpp | 2 +- .../yaml2obj/duplicate-section-names.test | 2 - .../yaml2obj/elf-comdat-broken-info.yaml | 2 - .../yaml2obj/elf-comdat-broken-members.yaml | 2 - .../tools/yaml2obj/elf-comdat-broken.yaml | 1 - .../tools/yaml2obj/elf-override-shname.yaml | 1 - .../tools/yaml2obj/elf-override-shoffset.yaml | 1 - .../tools/yaml2obj/elf-override-shsize.yaml | 1 - llvm/test/tools/yaml2obj/section-link.yaml | 50 +++++++++++++++++++ 11 files changed, 60 insertions(+), 14 deletions(-) diff --git a/llvm/include/llvm/ObjectYAML/ELFYAML.h b/llvm/include/llvm/ObjectYAML/ELFYAML.h index 57f802ca50e4..8cd12b3f7588 100644 --- a/llvm/include/llvm/ObjectYAML/ELFYAML.h +++ b/llvm/include/llvm/ObjectYAML/ELFYAML.h @@ -326,7 +326,7 @@ struct Group : Section { // Members of a group contain a flag and a list of section indices // that are part of the group. std::vector Members; - StringRef Signature; /* Info */ + Optional Signature; /* Info */ Group() : Section(SectionKind::Group) {} diff --git a/llvm/lib/ObjectYAML/ELFEmitter.cpp b/llvm/lib/ObjectYAML/ELFEmitter.cpp index d5cdb85eab5f..6a4e00c62857 100644 --- a/llvm/lib/ObjectYAML/ELFEmitter.cpp +++ b/llvm/lib/ObjectYAML/ELFEmitter.cpp @@ -791,10 +791,16 @@ void ELFState::writeSectionContent(Elf_Shdr &SHeader, assert(Section.Type == llvm::ELF::SHT_GROUP && "Section type is not SHT_GROUP"); + unsigned Link = 0; + if (Section.Link.empty() && SN2I.lookup(".symtab", Link)) + SHeader.sh_link = Link; + SHeader.sh_entsize = 4; SHeader.sh_size = SHeader.sh_entsize * Section.Members.size(); - SHeader.sh_info = - toSymbolIndex(Section.Signature, Section.Name, /*IsDynamic=*/false); + + if (Section.Signature) + SHeader.sh_info = + toSymbolIndex(*Section.Signature, Section.Name, /*IsDynamic=*/false); raw_ostream &OS = CBA.getOSAndAlignedOffset(SHeader.sh_offset, SHeader.sh_addralign); diff --git a/llvm/lib/ObjectYAML/ELFYAML.cpp b/llvm/lib/ObjectYAML/ELFYAML.cpp index ad316be85e8a..f362b9c23a7b 100644 --- a/llvm/lib/ObjectYAML/ELFYAML.cpp +++ b/llvm/lib/ObjectYAML/ELFYAML.cpp @@ -1069,7 +1069,7 @@ static void sectionMapping(IO &IO, ELFYAML::RelocationSection &Section) { static void groupSectionMapping(IO &IO, ELFYAML::Group &Group) { commonSectionMapping(IO, Group); - IO.mapOptional("Info", Group.Signature, StringRef()); + IO.mapOptional("Info", Group.Signature); IO.mapRequired("Members", Group.Members); } diff --git a/llvm/test/tools/yaml2obj/duplicate-section-names.test b/llvm/test/tools/yaml2obj/duplicate-section-names.test index 65d3de4c3039..4765179755e0 100644 --- a/llvm/test/tools/yaml2obj/duplicate-section-names.test +++ b/llvm/test/tools/yaml2obj/duplicate-section-names.test @@ -150,7 +150,6 @@ FileHeader: Sections: - Name: .group Type: SHT_GROUP - Link: .symtab Info: foo Members: - SectionOrType: GRP_COMDAT @@ -159,7 +158,6 @@ Sections: Type: SHT_PROGBITS - Name: '.group [1]' Type: SHT_GROUP - Link: .symtab Info: 'foo [1]' Members: - SectionOrType: GRP_COMDAT diff --git a/llvm/test/tools/yaml2obj/elf-comdat-broken-info.yaml b/llvm/test/tools/yaml2obj/elf-comdat-broken-info.yaml index 6f2f7acd4925..d79b250ccc95 100644 --- a/llvm/test/tools/yaml2obj/elf-comdat-broken-info.yaml +++ b/llvm/test/tools/yaml2obj/elf-comdat-broken-info.yaml @@ -42,13 +42,11 @@ FileHeader: Sections: - Name: .group1 Type: SHT_GROUP - Link: .symtab Info: foo Members: - SectionOrType: GRP_COMDAT - Name: .group2 Type: SHT_GROUP - Link: .symtab Info: bar Members: - SectionOrType: GRP_COMDAT diff --git a/llvm/test/tools/yaml2obj/elf-comdat-broken-members.yaml b/llvm/test/tools/yaml2obj/elf-comdat-broken-members.yaml index 63cb27e23d80..9ebcf02c9292 100644 --- a/llvm/test/tools/yaml2obj/elf-comdat-broken-members.yaml +++ b/llvm/test/tools/yaml2obj/elf-comdat-broken-members.yaml @@ -14,8 +14,6 @@ FileHeader: Sections: - Name: .group Type: SHT_GROUP - Link: .symtab - Info: 0 Members: - SectionOrType: GRP_COMDAT - SectionOrType: .foo diff --git a/llvm/test/tools/yaml2obj/elf-comdat-broken.yaml b/llvm/test/tools/yaml2obj/elf-comdat-broken.yaml index 87ff6fe66c00..88ed3c315c53 100644 --- a/llvm/test/tools/yaml2obj/elf-comdat-broken.yaml +++ b/llvm/test/tools/yaml2obj/elf-comdat-broken.yaml @@ -10,7 +10,6 @@ FileHeader: Sections: - Name: .group Type: SHT_GROUP - Link: .symtab Info: foo Members: - SectionOrType: 0xFF diff --git a/llvm/test/tools/yaml2obj/elf-override-shname.yaml b/llvm/test/tools/yaml2obj/elf-override-shname.yaml index 7c4cb615a38e..4698bc0eb499 100644 --- a/llvm/test/tools/yaml2obj/elf-override-shname.yaml +++ b/llvm/test/tools/yaml2obj/elf-override-shname.yaml @@ -63,7 +63,6 @@ Sections: ShName: 0x000000005 - Name: .group Type: SHT_GROUP - Info: 0 ShName: 0x000000006 Members: - Name: .gnu.version diff --git a/llvm/test/tools/yaml2obj/elf-override-shoffset.yaml b/llvm/test/tools/yaml2obj/elf-override-shoffset.yaml index 26ef2862de06..9fe5ef01fa17 100644 --- a/llvm/test/tools/yaml2obj/elf-override-shoffset.yaml +++ b/llvm/test/tools/yaml2obj/elf-override-shoffset.yaml @@ -43,7 +43,6 @@ Sections: ShOffset: 0x000000005 - Name: .group Type: SHT_GROUP - Info: 0 ShOffset: 0x000000006 Members: - Name: .gnu.version diff --git a/llvm/test/tools/yaml2obj/elf-override-shsize.yaml b/llvm/test/tools/yaml2obj/elf-override-shsize.yaml index c62e91a99459..4470ae22002f 100644 --- a/llvm/test/tools/yaml2obj/elf-override-shsize.yaml +++ b/llvm/test/tools/yaml2obj/elf-override-shsize.yaml @@ -43,7 +43,6 @@ Sections: ShSize: 0x000000005 - Name: .group Type: SHT_GROUP - Info: 0 ShSize: 0x000000006 Members: - Name: .gnu.version diff --git a/llvm/test/tools/yaml2obj/section-link.yaml b/llvm/test/tools/yaml2obj/section-link.yaml index 88595eafd693..efe4d3fea74d 100644 --- a/llvm/test/tools/yaml2obj/section-link.yaml +++ b/llvm/test/tools/yaml2obj/section-link.yaml @@ -44,3 +44,53 @@ Sections: - Name: .bar Type: SHT_PROGBITS Link: .unknown2 + +## Check we link SHT_GROUP to a symbol table by default if it exists. +## Also, check we can set an arbitrary value for sh_link. + +# RUN: yaml2obj --docnum=3 %s -o %t3 +# RUN: llvm-readobj --sections %t3 | FileCheck %s --check-prefix=GROUP-LINK + +# GROUP-LINK: Name: .group1 +# GROUP-LINK: Link: +# GROUP-LINK-SAME: 3 + +# GROUP-LINK: Name: .group2 +# GROUP-LINK: Link: +# GROUP-LINK-SAME: 255 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .group1 + Type: SHT_GROUP + Members: + - Name: .group2 + Type: SHT_GROUP + Link: 0xFF + Members: +Symbols: [] + +## Check we set SHT_GROUP's link value to 0 when there is no symbol table. + +# RUN: yaml2obj --docnum=4 %s -o %t4 +# RUN: llvm-readobj --sections %t4 | FileCheck %s --check-prefix=GROUP-LINK-NOSYMTAB + +# GROUP-LINK-NOSYMTAB: Name: .group +# GROUP-LINK-NOSYMTAB: Link: +# GROUP-LINK-NOSYMTAB-SAME: 0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .group + Type: SHT_GROUP + Members: