diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -1448,6 +1448,10 @@ // eliminate it. Mark the symbol as "used" to prevent it. sym->isUsedInRegularObj = true; + // GNU linkers allow -u foo -ldef -lref. We should not treat it as a backward + // reference. + backwardReferences.erase(sym); + if (sym->isLazy()) sym->fetch(); } diff --git a/lld/test/ELF/warn-backrefs.s b/lld/test/ELF/warn-backrefs.s --- a/lld/test/ELF/warn-backrefs.s +++ b/lld/test/ELF/warn-backrefs.s @@ -62,6 +62,12 @@ ## --warn-backrefs does not warn. # RUN: ld.lld --fatal-warnings --warn-backrefs %t2.a %t1.o %t2.so %t2.a -o /dev/null +## In GNU linkers, -u does not make a backward reference. +# RUN: ld.lld --fatal-warnings --warn-backrefs -u foo %t2.a %t1.o -o /dev/null + +## In GNU gold, --export-dynamic-symbol does not make a backward reference. +# RUN: ld.lld --fatal-warnings --warn-backrefs --export-dynamic-symbol foo %t2.a %t1.o -o /dev/null + .globl _start, foo _start: call foo