Index: ELF/Arch/X86_64.cpp =================================================================== --- ELF/Arch/X86_64.cpp +++ ELF/Arch/X86_64.cpp @@ -105,6 +105,9 @@ case R_X86_64_REX_GOTPCRELX: case R_X86_64_GOTTPOFF: return R_GOT_PC; + case R_X86_64_GOTPC32: + case R_X86_64_GOTPC64: + return R_GOTONLY_PC_FROM_END; case R_X86_64_NONE: return R_NONE; default: @@ -300,6 +303,7 @@ case R_X86_64_32S: case R_X86_64_TPOFF32: case R_X86_64_GOT32: + case R_X86_64_GOTPC32: case R_X86_64_GOTPCREL: case R_X86_64_GOTPCRELX: case R_X86_64_REX_GOTPCRELX: @@ -319,6 +323,7 @@ case R_X86_64_PC64: case R_X86_64_SIZE64: case R_X86_64_GOT64: + case R_X86_64_GOTPC64: write64le(Loc, Val); break; default: Index: ELF/Relocations.cpp =================================================================== --- ELF/Relocations.cpp +++ ELF/Relocations.cpp @@ -347,7 +347,7 @@ if (isRelExprOneOf(E)) return true; Index: test/ELF/x86-64-reloc-got.s =================================================================== --- /dev/null +++ test/ELF/x86-64-reloc-got.s @@ -0,0 +1,12 @@ +// REQUIRES: x86 +// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o +// RUN: ld.lld %t.o -shared -o %t.so +// RUN: llvm-objdump -d %t.so | FileCheck %s + +// 0x3070 (.got end) - 0x1000 = 8304 + +// CHECK: R_X86_64_GOTPC64: +// CHECK-NEXT: 1000: {{.*}} movabsq $8304, %r11 +.global R_X86_64_GOTPC64 +R_X86_64_GOTPC64: + movabsq $_GLOBAL_OFFSET_TABLE_-., %r11 Index: test/ELF/x86-64-reloc-got2.test =================================================================== --- /dev/null +++ test/ELF/x86-64-reloc-got2.test @@ -0,0 +1,62 @@ +# RUN: yaml2obj %s -o %t.o +# RUN: ld.lld %t.o -shared -o %t.so +# RUN: llvm-objdump -d %t.so | FileCheck %s + +# This object file is assembled by GNU as as llvm-mc does not generate R_X86_64_GOTPC32 relocation. +# +# .global R_X86_64_GOTPC32 +# R_X86_64_GOTPC32: +# leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax + +# 0x3070 (.got end) - (0x1000 + 7) = 8297 +# CHECK: R_X86_64_GOTPC32: +# CHECK-NEXT: 1000: {{.*}} leaq 8297(%rip), %rax +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000001 + Content: 488D0500000000 + - Name: .rela.text + Type: SHT_RELA + Flags: [ SHF_INFO_LINK ] + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000003 + Symbol: _GLOBAL_OFFSET_TABLE_ + Type: R_X86_64_GOTPC32 + Addend: -4 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000001 +Symbols: + Local: + - Name: .text + Type: STT_SECTION + Section: .text + - Name: .data + Type: STT_SECTION + Section: .data + - Name: .bss + Type: STT_SECTION + Section: .bss + Global: + - Name: R_X86_64_GOTPC32 + Section: .text + - Name: _GLOBAL_OFFSET_TABLE_ +DynamicSymbols: +...