Index: ELF/Relocations.cpp =================================================================== --- ELF/Relocations.cpp +++ ELF/Relocations.cpp @@ -356,6 +356,10 @@ return true; if (&Body == ElfSym::MipsGpDisp) return true; + // Sometimes code has relocations to absolute symbol defined in linker script. + // Example is linux kernel. Hence we allow it. + if (!Body.File) + return true; error(S.getLocation(RelOff) + ": relocation " + toString(Type) + " cannot refer to absolute symbol '" + toString(Body) + "' defined in " + toString(Body.File)); Index: test/ELF/linkerscript/relative-absolute.s =================================================================== --- test/ELF/linkerscript/relative-absolute.s +++ test/ELF/linkerscript/relative-absolute.s @@ -0,0 +1,30 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t1.o +# RUN: echo "SECTIONS { vvar_vsyscall_gtod_data = 0x10000; }" > %t.script +# RUN: ld.lld -shared %t1.o --script %t.script -o %t +# RUN: llvm-objdump -d %t | FileCheck %s --check-prefix=DUMP +# RUN: llvm-readobj -t %t | FileCheck %s --check-prefix=SYMBOL + +# DUMP: Disassembly of section .text: +# DUMP-NEXT: foo: +# DUMP-NEXT: 0: {{.*}} 65530(%rip), %eax + +# SYMBOL: Symbol { +# SYMBOL: Name: vvar_vsyscall_gtod_data +# SYMBOL-NEXT: Value: 0x10000 +# SYMBOL-NEXT: Size: 0 +# SYMBOL-NEXT: Binding: Local +# SYMBOL-NEXT: Type: None +# SYMBOL-NEXT: Other [ +# SYMBOL-NEXT: STV_HIDDEN +# SYMBOL-NEXT: ] +# SYMBOL-NEXT: Section: Absolute (0xFFF1) +# SYMBOL-NEXT: } + +.text +.globl foo +.type foo, @function +foo: + movl vvar_vsyscall_gtod_data(%rip), %eax + +.hidden vvar_vsyscall_gtod_data