Index: ELF/Relocations.cpp =================================================================== --- ELF/Relocations.cpp +++ ELF/Relocations.cpp @@ -328,23 +328,8 @@ bool AbsVal = isAbsoluteValue(Body); bool RelE = isRelExpr(E); - if (AbsVal && !RelE) + if (AbsVal || RelE) return true; - if (!AbsVal && RelE) - return true; - - // Relative relocation to an absolute value. This is normally unrepresentable, - // but if the relocation refers to a weak undefined symbol, we allow it to - // resolve to the image base. This is a little strange, but it allows us to - // link function calls to such symbols. Normally such a call will be guarded - // with a comparison, which will load a zero from the GOT. - if (AbsVal && RelE) { - if (Body.isUndefined() && !Body.isLocal() && Body.symbol()->isWeak()) - return true; - error("relocation " + getRelName(Type) + - " cannot refer to absolute symbol " + Body.getName()); - return true; - } return Target->usesOnlyLowPageBits(Type); } Index: test/ELF/relocation-relative-absolute.s =================================================================== --- test/ELF/relocation-relative-absolute.s +++ test/ELF/relocation-relative-absolute.s @@ -1,11 +1,14 @@ # REQUIRES: x86 # RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o -# RUN: not ld.lld %t.o -o %t -pie 2>&1 | FileCheck %s +# RUN: ld.lld %t.o -o %t -pie +# RUN: llvm-readobj -dyn-relocations %t | FileCheck %s + +# CHECK: Dynamic Relocations { +# CHECK-NEXT: } .globl _start _start: -# CHECK: relocation R_X86_64_PLT32 cannot refer to absolute symbol answer call answer@PLT .globl answer