Index: lld/trunk/ELF/InputSection.cpp =================================================================== --- lld/trunk/ELF/InputSection.cpp +++ lld/trunk/ELF/InputSection.cpp @@ -668,6 +668,13 @@ if (Expr == R_NONE) continue; if (Expr != R_ABS) { + // GCC 8.0 or earlier have a bug that it emits R_386_GOTPC relocations + // against _GLOBAL_OFFSET_TABLE for .debug_info. The bug seems to have + // been fixed in 2017: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82630, + // but we need to keep this bug-compatible code for a while. + if (Config->EMachine == EM_386 && Type == R_386_GOTPC) + continue; + error(this->getLocation(Offset) + ": has non-ABS relocation " + toString(Type) + " against symbol '" + toString(Sym) + "'"); return; Index: lld/trunk/test/ELF/i386-debug-noabs.test =================================================================== --- lld/trunk/test/ELF/i386-debug-noabs.test +++ lld/trunk/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 + +## This is for https://bugs.llvm.org//show_bug.cgi?id=34852. GCC 8.0 or +## earlier have a bug which creates non-absolute R_386_GOTPC relocations +## in non-allocated sections. It is illegal, but we want to make sure that +## lld skips them instead of reporting errors. + +--- !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_