This change introduces new synthetic sections IpltSection, IgotPltSection that represent the ifunc entries that would previously have been put in the PltSection and the GotPltSection. The separation makes sure that the R_*_IRELATIVE relocations are placed after the non R_*_IRELATIVE relocations, which permits ifunc resolvers to know that the .got.plt slots will be initialized prior to the resolver being called. A secondary benefit is that for ARM we can move the IgotPltSection and its dynamic relocations to the .got and .rel.dyn as the ARM glibc expects all the R_*_IRELATIVE relocations to be in the .rel.dyn Differential revision: https://reviews.llvm.org/D27406 llvm-svn: 289045
128 lines
3.5 KiB
ArmAsm
128 lines
3.5 KiB
ArmAsm
// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
|
|
// RUN: ld.lld -static %t.o -o %tout
|
|
// RUN: llvm-objdump -d %tout | FileCheck %s --check-prefix=DISASM
|
|
// RUN: llvm-readobj -r -symbols -sections %tout | FileCheck %s
|
|
// REQUIRES: x86
|
|
|
|
// CHECK: Sections [
|
|
// CHECK: Section {
|
|
// CHECK: Index: 1
|
|
// CHECK-NEXT: Name: .rela.plt
|
|
// CHECK-NEXT: Type: SHT_RELA
|
|
// CHECK-NEXT: Flags [
|
|
// CHECK-NEXT: SHF_ALLOC
|
|
// CHECK-NEXT: ]
|
|
// CHECK-NEXT: Address: [[RELA:.*]]
|
|
// CHECK-NEXT: Offset: 0x158
|
|
// CHECK-NEXT: Size: 48
|
|
// CHECK-NEXT: Link: 6
|
|
// CHECK-NEXT: Info: 0
|
|
// CHECK-NEXT: AddressAlignment: 8
|
|
// CHECK-NEXT: EntrySize: 24
|
|
// CHECK-NEXT: }
|
|
// CHECK: Relocations [
|
|
// CHECK-NEXT: Section ({{.*}}) .rela.plt {
|
|
// CHECK-NEXT: 0x202000 R_X86_64_IRELATIVE
|
|
// CHECK-NEXT: 0x202008 R_X86_64_IRELATIVE
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: ]
|
|
// CHECK: Symbols [
|
|
// CHECK-NEXT: Symbol {
|
|
// CHECK-NEXT: Name:
|
|
// CHECK-NEXT: Value: 0x0
|
|
// CHECK-NEXT: Size: 0
|
|
// CHECK-NEXT: Binding: Local
|
|
// CHECK-NEXT: Type: None
|
|
// CHECK-NEXT: Other: 0
|
|
// CHECK-NEXT: Section: Undefined
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: Symbol {
|
|
// CHECK-NEXT: Name: __rela_iplt_end
|
|
// CHECK-NEXT: Value: 0x200188
|
|
// CHECK-NEXT: Size: 0
|
|
// CHECK-NEXT: Binding: Local
|
|
// CHECK-NEXT: Type: None
|
|
// CHECK-NEXT: Other [
|
|
// CHECK-NEXT: STV_HIDDEN
|
|
// CHECK-NEXT: ]
|
|
// CHECK-NEXT: Section: .rela.plt
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: Symbol {
|
|
// CHECK-NEXT: Name: __rela_iplt_start
|
|
// CHECK-NEXT: Value: [[RELA]]
|
|
// CHECK-NEXT: Size: 0
|
|
// CHECK-NEXT: Binding: Local
|
|
// CHECK-NEXT: Type: None
|
|
// CHECK-NEXT: Other [
|
|
// CHECK-NEXT: STV_HIDDEN
|
|
// CHECK-NEXT: ]
|
|
// CHECK-NEXT: Section: .rela.plt
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: Symbol {
|
|
// CHECK-NEXT: Name: _start
|
|
// CHECK-NEXT: Value: 0x201002
|
|
// CHECK-NEXT: Size: 0
|
|
// CHECK-NEXT: Binding: Global
|
|
// CHECK-NEXT: Type: None
|
|
// CHECK-NEXT: Other: 0
|
|
// CHECK-NEXT: Section: .text
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: Symbol {
|
|
// CHECK-NEXT: Name: bar
|
|
// CHECK-NEXT: Value: 0x201001
|
|
// CHECK-NEXT: Size: 0
|
|
// CHECK-NEXT: Binding: Global
|
|
// CHECK-NEXT: Type: GNU_IFunc
|
|
// CHECK-NEXT: Other: 0
|
|
// CHECK-NEXT: Section: .text
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: Symbol {
|
|
// CHECK-NEXT: Name: foo
|
|
// CHECK-NEXT: Value: 0x201000
|
|
// CHECK-NEXT: Size: 0
|
|
// CHECK-NEXT: Binding: Global
|
|
// CHECK-NEXT: Type: GNU_IFunc
|
|
// CHECK-NEXT: Other: 0
|
|
// CHECK-NEXT: Section: .text
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: ]
|
|
|
|
// DISASM: Disassembly of section .text:
|
|
// DISASM-NEXT: foo:
|
|
// DISASM-NEXT: 201000: {{.*}} retq
|
|
// DISASM: bar:
|
|
// DISASM-NEXT: 201001: {{.*}} retq
|
|
// DISASM: _start:
|
|
// DISASM-NEXT: 201002: {{.*}} callq 25
|
|
// DISASM-NEXT: 201007: {{.*}} callq 36
|
|
// DISASM-NEXT: 20100c: {{.*}} movl $2097496, %edx
|
|
// DISASM-NEXT: 201011: {{.*}} movl $2097544, %edx
|
|
// DISASM-NEXT: 201016: {{.*}} movl $2097545, %edx
|
|
// DISASM-NEXT: Disassembly of section .plt:
|
|
// DISASM-NEXT: .plt:
|
|
// DISASM-NEXT: 201020: {{.*}} jmpq *4058(%rip)
|
|
// DISASM-NEXT: 201026: {{.*}} pushq $0
|
|
// DISASM-NEXT: 20102b: {{.*}} jmp -32 <_start+0xE>
|
|
// DISASM-NEXT: 201030: {{.*}} jmpq *4050(%rip)
|
|
// DISASM-NEXT: 201036: {{.*}} pushq $1
|
|
// DISASM-NEXT: 20103b: {{.*}} jmp -48 <_start+0xE>
|
|
|
|
.text
|
|
.type foo STT_GNU_IFUNC
|
|
.globl foo
|
|
foo:
|
|
ret
|
|
|
|
.type bar STT_GNU_IFUNC
|
|
.globl bar
|
|
bar:
|
|
ret
|
|
|
|
.globl _start
|
|
_start:
|
|
call foo
|
|
call bar
|
|
movl $__rela_iplt_start,%edx
|
|
movl $__rela_iplt_end,%edx
|
|
movl $__rela_iplt_end + 1,%edx
|