Index: ELF/Relocations.cpp =================================================================== --- ELF/Relocations.cpp +++ ELF/Relocations.cpp @@ -563,10 +563,15 @@ // 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))) { + std::string Hint = + "\n>>> Usually this error happens when -fPIC flag is missing during " + "compilation." + "\n>>> Unintentional use of such relocations is undesirable, and not " + "\n>>> permited by default, consider using -z notext."; error("can't create dynamic relocation " + toString(Type) + " against " + (Body.getName().empty() ? "local symbol" : "symbol: " + toString(Body)) + - " in readonly segment" + getLocation(S, Body, RelOff)); + " in readonly segment" + getLocation(S, Body, RelOff) + Hint); return Expr; } Index: test/ELF/dynamic-reloc-in-ro.s =================================================================== --- test/ELF/dynamic-reloc-in-ro.s +++ test/ELF/dynamic-reloc-in-ro.s @@ -2,9 +2,11 @@ // RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o // RUN: not ld.lld %t.o -o %t.so -shared 2>&1 | FileCheck %s -// CHECK: can't create dynamic relocation R_X86_64_64 against local symbol in readonly segment -// CHECK: >>> defined in {{.*}}.o -// CHECK: >>> referenced by {{.*}}.o:(.text+0x0) - +// CHECK: can't create dynamic relocation R_X86_64_64 against local symbol in readonly segment +// CHECK-NEXT: >>> defined in {{.*}}.o +// CHECK-NEXT: >>> referenced by {{.*}}.o:(.text+0x0) +// CHECK-NEXT: >>> Usually this error happens when -fPIC flag is missing during compilation. +// CHECK-NEXT: >>> Unintentional use of such relocations is undesirable, and not +// CHECK-NEXT: >>> permited by default, consider using -z notext. foo: .quad foo