Index: ELF/Relocations.cpp =================================================================== --- ELF/Relocations.cpp +++ ELF/Relocations.cpp @@ -589,25 +589,11 @@ if (S.Flags & SHF_WRITE) 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. - if (!Config->ZText) { - // We use PLT for relocations that may overflow in runtime, - // see comment for getPltExpr(). - if (Sym.isFunc() && !Target->isPicRel(Type)) - return getPltExpr(Sym, Expr, IsConstant); - 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()) { @@ -616,6 +602,20 @@ return Expr; } + // 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. + if (!Config->ZText) { + // We use PLT for relocations that may overflow in runtime, + // see comment for getPltExpr(). + if (Sym.isFunc() && !Target->isPicRel(Type)) + return getPltExpr(Sym, Expr, 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. + // 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