Index: ELF/Relocations.cpp =================================================================== --- ELF/Relocations.cpp +++ ELF/Relocations.cpp @@ -591,6 +591,19 @@ if (S.Flags & SHF_WRITE) return Expr; + // If a relocation can be applied at link-time, we don't need to + // create a dynamic relocation in the first place. + if (IsConstant) + return Expr; + + // If the relocation is to a weak undef, give up on it and produce a + // non preemptible 0. + if (Sym.isUndefWeak()) { + Sym.IsPreemptible = false; + IsConstant = true; + return Expr; + } + // Or, if we are allowed to create dynamic relocations against // read-only sections (i.e. when "-z notext" is given), // we can create a dynamic relocation as we want, too. @@ -602,22 +615,9 @@ return Expr; } - // If a relocation can be applied at link-time, we don't need to - // create a dynamic relocation in the first place. - if (IsConstant) - return Expr; - // If we got here we know that this relocation would require the dynamic // linker to write a value to read only memory. - // If the relocation is to a weak undef, give up on it and produce a - // non preemptible 0. - if (Sym.isUndefWeak()) { - Sym.IsPreemptible = false; - IsConstant = true; - return Expr; - } - // We can hack around it if we are producing an executable and // the refered symbol can be preemepted to refer to the executable. if (Config->Shared || (Config->Pic && !isRelExpr(Expr))) { Index: test/ELF/znotext-weak-undef.s =================================================================== --- test/ELF/znotext-weak-undef.s +++ test/ELF/znotext-weak-undef.s @@ -0,0 +1,14 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o +# RUN: ld.lld -z notext -shared %t.o -o %t +# RUN: llvm-readobj -r %t | FileCheck %s + +# CHECK: Relocations [ +# CHECK-NEXT: ] + +.text +.global foo +.weak foo + +_start: +mov $foo,%eax