Index: lld/ELF/InputFiles.cpp =================================================================== --- lld/ELF/InputFiles.cpp +++ lld/ELF/InputFiles.cpp @@ -632,6 +632,8 @@ break; case SHT_SYMTAB: case SHT_STRTAB: + case SHT_REL: + case SHT_RELA: case SHT_NULL: break; default: @@ -639,11 +641,23 @@ } } - // This block handles SHF_LINK_ORDER. + // We have the second loop. It is used to: + // 1) handle SHF_LINK_ORDER sections. + // 2) create SHT_REL[A] sections. In a specific case it might be possible + // to have a relocatable section that follows the corresponding relocation + // section. In this case the relocation section references the target + // section that is not yet created and we error out. For simplicity of + // implementation, we do not implement the creation of sections on demand. for (size_t i = 0, e = objSections.size(); i < e; ++i) { if (this->sections[i] == &InputSection::discarded) continue; const Elf_Shdr &sec = objSections[i]; + + // Create SHT_REL[A] sections. + if (sec.sh_type == SHT_REL || sec.sh_type == SHT_RELA) + this->sections[i] = createInputSection(sec); + + // This block handles SHF_LINK_ORDER. if (!(sec.sh_flags & SHF_LINK_ORDER)) continue; Index: lld/test/ELF/reloc-sec-before-target.test =================================================================== --- /dev/null +++ lld/test/ELF/reloc-sec-before-target.test @@ -0,0 +1,33 @@ +# RUN: yaml2obj %s -o %t.o +# RUN: ld.lld -shared %t.o -o %t +# RUN: llvm-readelf --relocs %t | FileCheck %s + +## In this case we have an object with a relocation section before +## the corresponding relocatable target section. Normally it is not what +## compilers would emit. We have to support it, because some custom tools might +## want to use this feature, which is not restricted by ELF gABI. + +## Check we handle the relocation properly. +# CHECK: Relocation section '.rela.dyn' at offset 0x238 contains 1 entries: +# CHECK-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend +# CHECK-NEXT: 00000000000022f0 0000000100000001 R_X86_64_64 0000000000000000 foo + 0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .rela.data + Type: SHT_RELA + Info: .data + Relocations: + - Symbol: foo + Type: R_X86_64_64 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_WRITE ] +Symbols: + - Name: foo + Binding: STB_GLOBAL