forked from OSchip/llvm-project
[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:
parent
5a955cc8b9
commit
5b118a0471
|
@ -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) {}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in New Issue