Index: ELF/Relocations.cpp =================================================================== --- ELF/Relocations.cpp +++ ELF/Relocations.cpp @@ -338,24 +338,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(S.getLocation(RelOff) + ": relocation " + toString(Type) + - " cannot refer to absolute symbol '" + toString(Body) + - "' defined in " + toString(Body.File)); - return true; - } return Target->usesOnlyLowPageBits(Type); } Index: test/ELF/linkerscript/symbol-absolute.s =================================================================== --- /dev/null +++ test/ELF/linkerscript/symbol-absolute.s @@ -0,0 +1,12 @@ +# REQUIRES: x86 + +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t +# RUN: echo "PROVIDE_HIDDEN(base = 0);" > %t.script +# RUN: ld.lld -shared --gc-sections --script %t.script -o %t1 %t +# RUN: llvm-readobj --elf-output-style=GNU --file-headers --symbols %t1 | FileCheck %s +# CHECK: 0000000000000000 0 NOTYPE LOCAL HIDDEN ABS base + +.text +.globl _start +_start: + lea base(%rip),%rax Index: test/ELF/relocation-relative-absolute.s =================================================================== --- test/ELF/relocation-relative-absolute.s +++ test/ELF/relocation-relative-absolute.s @@ -2,11 +2,13 @@ # RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %tinput1.o # RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux \ # RUN: %S/Inputs/relocation-relative-absolute.s -o %tinput2.o -# RUN: not ld.lld %tinput1.o %tinput2.o -o %t -pie 2>&1 | FileCheck %s +# RUN: ld.lld %tinput1.o %tinput2.o -o %t -pie +# RUN: llvm-readobj -dyn-relocations %t | FileCheck %s + +# CHECK: Dynamic Relocations { +# CHECK-NEXT: } .globl _start _start: -# CHECK: {{.*}}input1.o:(.text+0x1): relocation R_X86_64_PLT32 cannot refer to absolute symbol 'answer' defined in {{.*}}input2.o - call answer@PLT