[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
This commit is contained in:
Georgii Rymar 2019-10-28 13:30:05 +03:00
parent 5a955cc8b9
commit 5b118a0471
11 changed files with 60 additions and 14 deletions

View File

@ -326,7 +326,7 @@ struct Group : Section {
// Members of a group contain a flag and a list of section indices // Members of a group contain a flag and a list of section indices
// that are part of the group. // that are part of the group.
std::vector<SectionOrType> Members; std::vector<SectionOrType> Members;
StringRef Signature; /* Info */ Optional<StringRef> Signature; /* Info */
Group() : Section(SectionKind::Group) {} Group() : Section(SectionKind::Group) {}

View File

@ -791,10 +791,16 @@ void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
assert(Section.Type == llvm::ELF::SHT_GROUP && assert(Section.Type == llvm::ELF::SHT_GROUP &&
"Section type is not 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_entsize = 4;
SHeader.sh_size = SHeader.sh_entsize * Section.Members.size(); 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 = raw_ostream &OS =
CBA.getOSAndAlignedOffset(SHeader.sh_offset, SHeader.sh_addralign); CBA.getOSAndAlignedOffset(SHeader.sh_offset, SHeader.sh_addralign);

View File

@ -1069,7 +1069,7 @@ static void sectionMapping(IO &IO, ELFYAML::RelocationSection &Section) {
static void groupSectionMapping(IO &IO, ELFYAML::Group &Group) { static void groupSectionMapping(IO &IO, ELFYAML::Group &Group) {
commonSectionMapping(IO, Group); commonSectionMapping(IO, Group);
IO.mapOptional("Info", Group.Signature, StringRef()); IO.mapOptional("Info", Group.Signature);
IO.mapRequired("Members", Group.Members); IO.mapRequired("Members", Group.Members);
} }

View File

@ -150,7 +150,6 @@ FileHeader:
Sections: Sections:
- Name: .group - Name: .group
Type: SHT_GROUP Type: SHT_GROUP
Link: .symtab
Info: foo Info: foo
Members: Members:
- SectionOrType: GRP_COMDAT - SectionOrType: GRP_COMDAT
@ -159,7 +158,6 @@ Sections:
Type: SHT_PROGBITS Type: SHT_PROGBITS
- Name: '.group [1]' - Name: '.group [1]'
Type: SHT_GROUP Type: SHT_GROUP
Link: .symtab
Info: 'foo [1]' Info: 'foo [1]'
Members: Members:
- SectionOrType: GRP_COMDAT - SectionOrType: GRP_COMDAT

View File

@ -42,13 +42,11 @@ FileHeader:
Sections: Sections:
- Name: .group1 - Name: .group1
Type: SHT_GROUP Type: SHT_GROUP
Link: .symtab
Info: foo Info: foo
Members: Members:
- SectionOrType: GRP_COMDAT - SectionOrType: GRP_COMDAT
- Name: .group2 - Name: .group2
Type: SHT_GROUP Type: SHT_GROUP
Link: .symtab
Info: bar Info: bar
Members: Members:
- SectionOrType: GRP_COMDAT - SectionOrType: GRP_COMDAT

View File

@ -14,8 +14,6 @@ FileHeader:
Sections: Sections:
- Name: .group - Name: .group
Type: SHT_GROUP Type: SHT_GROUP
Link: .symtab
Info: 0
Members: Members:
- SectionOrType: GRP_COMDAT - SectionOrType: GRP_COMDAT
- SectionOrType: .foo - SectionOrType: .foo

View File

@ -10,7 +10,6 @@ FileHeader:
Sections: Sections:
- Name: .group - Name: .group
Type: SHT_GROUP Type: SHT_GROUP
Link: .symtab
Info: foo Info: foo
Members: Members:
- SectionOrType: 0xFF - SectionOrType: 0xFF

View File

@ -63,7 +63,6 @@ Sections:
ShName: 0x000000005 ShName: 0x000000005
- Name: .group - Name: .group
Type: SHT_GROUP Type: SHT_GROUP
Info: 0
ShName: 0x000000006 ShName: 0x000000006
Members: Members:
- Name: .gnu.version - Name: .gnu.version

View File

@ -43,7 +43,6 @@ Sections:
ShOffset: 0x000000005 ShOffset: 0x000000005
- Name: .group - Name: .group
Type: SHT_GROUP Type: SHT_GROUP
Info: 0
ShOffset: 0x000000006 ShOffset: 0x000000006
Members: Members:
- Name: .gnu.version - Name: .gnu.version

View File

@ -43,7 +43,6 @@ Sections:
ShSize: 0x000000005 ShSize: 0x000000005
- Name: .group - Name: .group
Type: SHT_GROUP Type: SHT_GROUP
Info: 0
ShSize: 0x000000006 ShSize: 0x000000006
Members: Members:
- Name: .gnu.version - Name: .gnu.version

View File

@ -44,3 +44,53 @@ Sections:
- Name: .bar - Name: .bar
Type: SHT_PROGBITS Type: SHT_PROGBITS
Link: .unknown2 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: