Index: lld/ELF/ScriptParser.cpp =================================================================== --- lld/ELF/ScriptParser.cpp +++ lld/ELF/ScriptParser.cpp @@ -1310,7 +1310,10 @@ } if (tok == "DEFINED") { StringRef name = readParenLiteral(); - return [=] { return symtab->find(name) ? 1 : 0; }; + return [=] { + Symbol *b = symtab->find(name); + return (b && b->isDefined()) ? 1 : 0; + }; } if (tok == "LENGTH") { StringRef name = readParenLiteral(); Index: lld/test/ELF/linkerscript/Inputs/extern_defined.s =================================================================== --- /dev/null +++ lld/test/ELF/linkerscript/Inputs/extern_defined.s @@ -0,0 +1,6 @@ + .section .text + +__my_start: + .global __my_start + + Index: lld/test/ELF/linkerscript/extern_defined.test =================================================================== --- /dev/null +++ lld/test/ELF/linkerscript/extern_defined.test @@ -0,0 +1,5 @@ +# RUN: llvm-mc -filetype=obj %p/Inputs/extern_defined.s -o %t.o +# RUN: ld.lld -o %t3 --script %s %t.o + +EXTERN(__symbol1) +__my_start = DEFINED(__symbol1) ? __symbol1 : __my_start;