[yaml2obj] - Make .symtab to be not mandatory section for SHT_REL[A] section.

Before this change .symtab section was required for SHT_REL[A] section
declarations. yaml2obj automatically defined it in case when YAML document
did not have it.

With this change it is now possible to produce an object that
has a relocation section, but has no symbol table.

It simplifies the code and also it is inline with how we handle Link fields
for another special sections.

Differential revision: https://reviews.llvm.org/D69260
This commit is contained in:
Georgii Rymar 2019-10-28 13:47:44 +03:00
parent 5b3c0f5abf
commit e3a21fcc35
9 changed files with 9 additions and 15 deletions

View File

@ -205,17 +205,10 @@ template <class ELFT>
ELFState<ELFT>::ELFState(ELFYAML::Object &D, yaml::ErrorHandler EH)
: Doc(D), ErrHandler(EH) {
StringSet<> DocSections;
for (std::unique_ptr<ELFYAML::Section> &D : Doc.Sections) {
for (std::unique_ptr<ELFYAML::Section> &D : Doc.Sections)
if (!D->Name.empty())
DocSections.insert(D->Name);
// Some sections wants to link to .symtab by default.
// That means we want to create the symbol table for them.
if (D->Type == llvm::ELF::SHT_REL || D->Type == llvm::ELF::SHT_RELA)
if (!Doc.Symbols && D->Link.empty())
Doc.Symbols.emplace();
}
// Insert SHT_NULL section implicitly when it is not defined in YAML.
if (Doc.Sections.empty() || Doc.Sections.front()->Type != ELF::SHT_NULL)
Doc.Sections.insert(
@ -742,8 +735,9 @@ void ELFState<ELFT>::writeSectionContent(
SHeader.sh_size = SHeader.sh_entsize * Section.Relocations.size();
// For relocation section set link to .symtab by default.
if (Section.Link.empty())
SHeader.sh_link = SN2I.get(".symtab");
unsigned Link = 0;
if (Section.Link.empty() && SN2I.lookup(".symtab", Link))
SHeader.sh_link = Link;
if (!Section.RelocatableSec.empty())
SHeader.sh_info = toSectionIndex(Section.RelocatableSec, Section.Name);

View File

@ -333,6 +333,7 @@ Sections:
- Offset: 0x0
Type: R_X86_64_64
Symbol: 0xFFFFFF
Symbols: []
## Check llvm-readobj does not crash on a truncated ELF.

View File

@ -39,3 +39,4 @@ Sections:
Address: 0x0000000000000038
Info: .text
Relocations:
Symbols: []

View File

@ -21,6 +21,8 @@ Sections:
Relocations:
- Offset: 0x1000
Type: R_X86_64_RELATIVE
## TODO: llvm-objcopy crashes without the following line.
Symbols: []
# CHECK: Relocations [
# CHECK-NEXT: Section (2) .rel.text {

View File

@ -110,3 +110,4 @@ ProgramHeaders:
- Type: PT_NOTE
Sections:
- Section: .note.gnu.build-id
Symbols: []

View File

@ -29,7 +29,6 @@ Sections:
Size: 0x10
- Name: .rela.text
Type: SHT_RELA
Link: .symtab
Info: .text
Relocations:
- Offset: 0

View File

@ -12,7 +12,6 @@
# CHECK-NEXT: Sections:
# CHECK-NEXT: - Name: .rela.text
# CHECK-NEXT: Type: SHT_RELA
# CHECK-NEXT: Link: .symtab
# CHECK-NEXT: EntSize: 0x0000000000000018
# CHECK-NEXT: Relocations:
# CHECK-NEXT: - Offset: 0x0000000000000000

View File

@ -16,7 +16,6 @@
# CHECK-NEXT: Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
# CHECK-NEXT: - Name: .rela.text
# CHECK-NEXT: Type: SHT_RELA
# CHECK-NEXT: Link: .symtab
# CHECK-NEXT: EntSize: 0x0000000000000018
# CHECK-NEXT: Info: .text
# CHECK-NEXT: Relocations:
@ -24,7 +23,6 @@
# CHECK-NEXT: Type: R_X86_64_NONE
# CHECK-NEXT: - Offset: 0x0000000000000004
# CHECK-NEXT: Type: R_X86_64_NONE
# CHECK-NEXT: Symbols: []
# CHECK-NEXT: ...
--- !ELF

View File

@ -12,7 +12,6 @@
# CHECK-NEXT: Sections:
# CHECK-NEXT: - Name: .rela.text
# CHECK-NEXT: Type: SHT_RELA
# CHECK-NEXT: Link: .symtab
# CHECK-NEXT: EntSize: 0x0000000000000018
# CHECK-NEXT: Relocations:
# CHECK-NEXT: - Offset: 0x0000000000000001