Index: ELF/InputSection.cpp =================================================================== --- ELF/InputSection.cpp +++ ELF/InputSection.cpp @@ -666,6 +666,14 @@ if (Expr == R_NONE) continue; if (Expr != R_ABS) { + // At the moment of 20 october 2017, gcc has a bug which creates + // R_386_GOTPC relocation against _GLOBAL_OFFSET_TABLE_ in .debug_info. + // We ignore such relocation. All gcc versions seem to be affected. + // TODO: remove this hack once issue is fixed and we stop supporting + // gcc versions affected. + if (Config->EMachine == EM_386 && Expr == R_GOTONLY_PC_FROM_END) + continue; + error(this->getLocation(Offset) + ": has non-ABS relocation " + toString(Type) + " against symbol '" + toString(Sym) + "'"); 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_