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
|
||||
// that are part of the group.
|
||||
std::vector<SectionOrType> Members;
|
||||
StringRef Signature; /* Info */
|
||||
Optional<StringRef> Signature; /* Info */
|
||||
|
||||
Group() : Section(SectionKind::Group) {}
|
||||
|
||||
|
|
|
@ -791,10 +791,16 @@ void ELFState<ELFT>::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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -14,8 +14,6 @@ FileHeader:
|
|||
Sections:
|
||||
- Name: .group
|
||||
Type: SHT_GROUP
|
||||
Link: .symtab
|
||||
Info: 0
|
||||
Members:
|
||||
- SectionOrType: GRP_COMDAT
|
||||
- SectionOrType: .foo
|
||||
|
|
|
@ -10,7 +10,6 @@ FileHeader:
|
|||
Sections:
|
||||
- Name: .group
|
||||
Type: SHT_GROUP
|
||||
Link: .symtab
|
||||
Info: foo
|
||||
Members:
|
||||
- SectionOrType: 0xFF
|
||||
|
|
|
@ -63,7 +63,6 @@ Sections:
|
|||
ShName: 0x000000005
|
||||
- Name: .group
|
||||
Type: SHT_GROUP
|
||||
Info: 0
|
||||
ShName: 0x000000006
|
||||
Members:
|
||||
- Name: .gnu.version
|
||||
|
|
|
@ -43,7 +43,6 @@ Sections:
|
|||
ShOffset: 0x000000005
|
||||
- Name: .group
|
||||
Type: SHT_GROUP
|
||||
Info: 0
|
||||
ShOffset: 0x000000006
|
||||
Members:
|
||||
- Name: .gnu.version
|
||||
|
|
|
@ -43,7 +43,6 @@ Sections:
|
|||
ShSize: 0x000000005
|
||||
- Name: .group
|
||||
Type: SHT_GROUP
|
||||
Info: 0
|
||||
ShSize: 0x000000006
|
||||
Members:
|
||||
- Name: .gnu.version
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue