Index: ELF/InputSection.cpp =================================================================== --- ELF/InputSection.cpp +++ ELF/InputSection.cpp @@ -683,6 +683,12 @@ if (Expr == R_NONE) continue; if (Expr != R_ABS) { + // gcc-5.4 has a bug which creates R_386_GOTPC relocation against + // _GLOBAL_OFFSET_TABLE_ in .debug_info. We ignore such relocation. + // TODO: remove this hack once we stop supporting gcc-5.4. + if (Config->EMachine == EM_386 && Expr == R_GOTONLY_PC_FROM_END && + Sym.getName() == "_GLOBAL_OFFSET_TABLE_") + continue; error(this->getLocation(Offset) + ": has non-ABS reloc"); return; } Index: test/ELF/i386-debug-noabs.test =================================================================== --- test/ELF/i386-debug-noabs.test +++ test/ELF/i386-debug-noabs.test @@ -0,0 +1,33 @@ +# REQUIRES: x86 + +# RUN: yaml2obj %s -o %t.o +# RUN: ld.lld %t.o -o %t.exe + +## It is for PR34852 (https://bugs.llvm.org//show_bug.cgi?id=34852) +## gcc-5.4 has a bug which creates non-absolute R_386_GOTPC relocation +## against _GLOBAL_OFFSET_TABLE_ when producing objects for i386 target. +## Here we check that LLD is able to use such objects. + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_386 +Sections: + - Name: .debug_info + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: 0000000000000000 + - Name: .rel.debug_info + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: .debug_info + Relocations: + - Offset: 0x000000000000041F + Symbol: _GLOBAL_OFFSET_TABLE_ + Type: R_386_GOTPC +Symbols: + Global: + - Name: _GLOBAL_OFFSET_TABLE_