Index: ELF/InputSection.cpp =================================================================== --- ELF/InputSection.cpp +++ ELF/InputSection.cpp @@ -669,6 +669,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: 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-8.0 or earlier 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_