// 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) {}
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);
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);
}
Sections:
- Name: .group
Type: SHT_GROUP
- Link: .symtab
Info: foo
Members:
- SectionOrType: GRP_COMDAT
Type: SHT_PROGBITS
- Name: '.group [1]'
Type: SHT_GROUP
- Link: .symtab
Info: 'foo [1]'
Members:
- SectionOrType: GRP_COMDAT
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
Sections:
- Name: .group
Type: SHT_GROUP
- Link: .symtab
- Info: 0
Members:
- SectionOrType: GRP_COMDAT
- SectionOrType: .foo
Sections:
- Name: .group
Type: SHT_GROUP
- Link: .symtab
Info: foo
Members:
- SectionOrType: 0xFF
ShName: 0x000000005
- Name: .group
Type: SHT_GROUP
- Info: 0
ShName: 0x000000006
Members:
- Name: .gnu.version
ShOffset: 0x000000005
- Name: .group
Type: SHT_GROUP
- Info: 0
ShOffset: 0x000000006
Members:
- Name: .gnu.version
ShSize: 0x000000005
- Name: .group
Type: SHT_GROUP
- Info: 0
ShSize: 0x000000006
Members:
- Name: .gnu.version
- 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: