Index: ELF/Relocations.cpp =================================================================== --- ELF/Relocations.cpp +++ ELF/Relocations.cpp @@ -585,6 +585,19 @@ static RelExpr adjustExpr(Symbol &Sym, RelExpr Expr, RelType Type, InputSectionBase &S, uint64_t RelOff, bool &IsConstant) { + // 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, and we producing executable, + // give up on it and produce a non preemptible 0. + if (!Config->Shared && Sym.isUndefWeak()) { + Sym.IsPreemptible = false; + IsConstant = true; + return Expr; + } + // If a section writable or if we are allowed to create dynamic relocations // against read-only sections (i.e. when "-z notext" is given), we can create // any dynamic relocation the dynamic linker knows how to handle. @@ -596,22 +609,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,16 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o +# RUN: not ld.lld -z notext -shared %t.o -o %t 2>&1 | FileCheck %s +# CHECK: relocation R_X86_64_32 cannot be used against shared object; recompile with -fPIC + +# RUN: ld.lld -z notext %t.o -o %t +# RUN: llvm-readobj -r %t | FileCheck %s --check-prefix=EXE +# EXE: Relocations [ +# EXE-NEXT: ] + +.text +.global foo +.weak foo + +_start: +mov $foo,%eax