[ELF] - Fix for: error "invalid section index: xxx" when linking FreeBSD kernel.

We found that GNU assembler 2.17.50 [FreeBSD] 2007-07-03
could generate broken objects. STT_SECTION symbols can be
associated with SHT_REL[A]/SHT_SYMTAB/SHT_STRTAB sections.

This is PR28868, patch fixes handling of such files.

Differential revision: https://reviews.llvm.org/D23201

llvm-svn: 278550
This commit is contained in:
George Rimar 2016-08-12 19:25:54 +00:00
parent 4c09318be2
commit 683a35d066
2 changed files with 42 additions and 2 deletions

View File

@ -343,10 +343,15 @@ elf::ObjectFile<ELFT>::getSection(const Elf_Sym &Sym) const {
uint32_t Index = this->getSectionIndex(Sym);
if (Index == 0)
return nullptr;
if (Index >= Sections.size() || !Sections[Index])
if (Index >= Sections.size())
fatal(getFilename(this) + ": invalid section index: " + Twine(Index));
InputSectionBase<ELFT> *S = Sections[Index];
if (S == &InputSectionBase<ELFT>::Discarded)
// We found that GNU assembler 2.17.50 [FreeBSD] 2007-07-03
// could generate broken objects. STT_SECTION symbols can be
// associated with SHT_REL[A]/SHT_SYMTAB/SHT_STRTAB sections.
// In this case it is fine for section to be null here as we
// do not allocate sections of these types.
if (!S || S == &InputSectionBase<ELFT>::Discarded)
return S;
return S->Repl;
}

View File

@ -0,0 +1,35 @@
# RUN: yaml2obj %s -o %t
# RUN: ld.lld -shared %t -o %tout
# Verify that lld can handle STT_SECTION symbols associated
# with SHT_REL[A]/SHT_SYMTAB/SHT_STRTAB sections.
!ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
OSABI: ELFOSABI_FREEBSD
Type: ET_REL
Machine: EM_X86_64
Sections:
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
AddressAlign: 0x0000000000000010
Content: "00000000"
- Name: .rela.text
Type: SHT_RELA
Link: .symtab
AddressAlign: 0x0000000000000008
Info: .text
Relocations:
Symbols:
Local:
- Type: STT_SECTION
Section: .rela.text
- Type: STT_SECTION
Section: .shstrtab
- Type: STT_SECTION
Section: .symtab
- Type: STT_SECTION
Section: .strtab