1// REQUIRES: x86
2// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
3// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/shared.s -o %t2.o
4// RUN: ld.lld -shared -soname=so %t2.o -o %t2.so
5// RUN: ld.lld -shared %t.o %t2.so -o %t
6// RUN: ld.lld %t.o %t2.so -o %t3
7// RUN: llvm-readobj -S -r %t | FileCheck %s
8// RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck --check-prefix=DISASM %s
9// RUN: llvm-readobj -S -r %t3 | FileCheck --check-prefix=CHECK2 %s
10// RUN: llvm-objdump -d --no-show-raw-insn %t3 | FileCheck --check-prefix=DISASM2 %s
11
12// CHECK:      Name: .plt
13// CHECK-NEXT: Type: SHT_PROGBITS
14// CHECK-NEXT: Flags [
15// CHECK-NEXT:   SHF_ALLOC
16// CHECK-NEXT:   SHF_EXECINSTR
17// CHECK-NEXT: ]
18// CHECK-NEXT: Address: 0x1320
19// CHECK-NEXT: Offset:
20// CHECK-NEXT: Size: 64
21// CHECK-NEXT: Link: 0
22// CHECK-NEXT: Info: 0
23// CHECK-NEXT: AddressAlignment: 16
24
25// CHECK:      Relocations [
26// CHECK-NEXT:   Section ({{.*}}) .rela.plt {
27// CHECK-NEXT:     0x3438 R_X86_64_JUMP_SLOT bar 0x0
28// CHECK-NEXT:     0x3440 R_X86_64_JUMP_SLOT zed 0x0
29// CHECK-NEXT:     0x3448 R_X86_64_JUMP_SLOT _start 0x0
30// CHECK-NEXT:   }
31// CHECK-NEXT: ]
32
33// CHECK2:      Name: .plt
34// CHECK2-NEXT: Type: SHT_PROGBITS
35// CHECK2-NEXT: Flags [
36// CHECK2-NEXT:   SHF_ALLOC
37// CHECK2-NEXT:   SHF_EXECINSTR
38// CHECK2-NEXT: ]
39// CHECK2-NEXT: Address: 0x2012E0
40// CHECK2-NEXT: Offset:
41// CHECK2-NEXT: Size: 48
42// CHECK2-NEXT: Link: 0
43// CHECK2-NEXT: Info: 0
44// CHECK2-NEXT: AddressAlignment: 16
45
46// CHECK2:      Relocations [
47// CHECK2-NEXT:   Section ({{.*}}) .rela.plt {
48// CHECK2-NEXT:     0x2033F8 R_X86_64_JUMP_SLOT bar 0x0
49// CHECK2-NEXT:     0x203400 R_X86_64_JUMP_SLOT zed 0x0
50// CHECK2-NEXT:   }
51// CHECK2-NEXT: ]
52
53// DISASM:      <_start>:
54// DISASM-NEXT:   jmp  {{.*}} <bar@plt>
55// DISASM-NEXT:   jmp  {{.*}} <bar@plt>
56// DISASM-NEXT:   jmp  {{.*}} <zed@plt>
57// DISASM-NEXT:   jmp  {{.*}} <_start@plt>
58
59// 0x3018 - 0x1036  = 8162
60// 0x3020 - 0x1046  = 8154
61// 0x3028 - 0x1056  = 8146
62
63// DISASM:      Disassembly of section .plt:
64// DISASM-EMPTY:
65// DISASM-NEXT: <.plt>:
66// DISASM-NEXT:   1320:       pushq 8450(%rip)
67// DISASM-NEXT:               jmpq *8452(%rip)
68// DISASM-NEXT:               nopl (%rax)
69// DISASM-EMPTY:
70// DISASM-NEXT:   <bar@plt>:
71// DISASM-NEXT:   1330:       jmpq *8450(%rip)
72// DISASM-NEXT:               pushq $0
73// DISASM-NEXT:               jmp 0x1320 <.plt>
74// DISASM-EMPTY:
75// DISASM-NEXT:   <zed@plt>:
76// DISASM-NEXT:   1340:       jmpq *8442(%rip)
77// DISASM-NEXT:               pushq $1
78// DISASM-NEXT:               jmp 0x1320 <.plt>
79// DISASM-EMPTY:
80// DISASM-NEXT:   <_start@plt>:
81// DISASM-NEXT:   1350:       jmpq *8434(%rip)
82// DISASM-NEXT:               pushq $2
83// DISASM-NEXT:               jmp 0x1320 <.plt>
84
85// 0x201030 - (0x201000 + 1) - 4 = 43
86// 0x201030 - (0x201005 + 1) - 4 = 38
87// 0x201040 - (0x20100a + 1) - 4 = 49
88// 0x201000 - (0x20100f + 1) - 4 = -20
89
90// DISASM2:      <_start>:
91// DISASM2-NEXT:   jmp  0x2012f0 <bar@plt>
92// DISASM2-NEXT:   jmp  0x2012f0 <bar@plt>
93// DISASM2-NEXT:   jmp  0x201300 <zed@plt>
94// DISASM2-NEXT:   jmp  0x2012c0 <_start>
95
96// 0x202018 - 0x201036  = 4066
97// 0x202020 - 0x201046  = 4058
98
99// DISASM2:      Disassembly of section .plt:
100// DISASM2-EMPTY:
101// DISASM2-NEXT: <.plt>:
102// DISASM2-NEXT:  2012e0:       pushq 8450(%rip)
103// DISASM2-NEXT:                jmpq *8452(%rip)
104// DISASM2-NEXT:                nopl  (%rax)
105// DISASM2-EMPTY:
106// DISASM2-NEXT: <bar@plt>:
107// DISASM2-NEXT:  2012f0:       jmpq *8450(%rip)
108// DISASM2-NEXT:                pushq $0
109// DISASM2-NEXT:                jmp 0x2012e0 <.plt>
110// DISASM2-EMPTY:
111// DISASM2-NEXT: <zed@plt>:
112// DISASM2-NEXT:  201300:       jmpq *8442(%rip)
113// DISASM2-NEXT:                pushq $1
114// DISASM2-NEXT:                jmp 0x2012e0 <.plt>
115// DISASM2-NOT:   {{.}}
116
117.global _start
118_start:
119  jmp bar@PLT
120  jmp bar@PLT
121  jmp zed@PLT
122  jmp _start@plt
123