1// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t
2// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/shared.s -o %t2
3// RUN: ld.lld %t2 -o %t2.so -shared
4// RUN: ld.lld %t %t2.so -o %t3
5// RUN: llvm-readobj -s  %t3 | FileCheck --check-prefix=SEC %s
6// RUN: llvm-objdump -s -d %t3 | FileCheck %s
7// REQUIRES: x86
8
9// SEC:      Name: .plt
10// SEC-NEXT: Type: SHT_PROGBITS
11// SEC-NEXT: Flags [
12// SEC-NEXT:   SHF_ALLOC
13// SEC-NEXT:   SHF_EXECINSTR
14// SEC-NEXT: ]
15// SEC-NEXT: Address: 0x201030
16// SEC-NEXT: Offset: 0x1030
17// SEC-NEXT: Size: 48
18
19// SEC:        Name: .got.plt
20// SEC-NEXT:   Type: SHT_PROGBITS
21// SEC-NEXT:   Flags [
22// SEC-NEXT:     SHF_ALLOC
23// SEC-NEXT:     SHF_WRITE
24// SEC-NEXT:   ]
25// SEC-NEXT:   Address: 0x202000
26// SEC-NEXT:   Offset: 0x2000
27// SEC-NEXT:   Size: 40
28// SEC-NEXT:   Link: 0
29// SEC-NEXT:   Info: 0
30// SEC-NEXT:   AddressAlignment: 8
31// SEC-NEXT:   EntrySize: 0
32// SEC-NEXT:   }
33
34// SEC:         Name: .got
35// SEC-NEXT:   Type: SHT_PROGBITS
36// SEC-NEXT:   Flags [
37// SEC-NEXT:     SHF_ALLOC
38// SEC-NEXT:     SHF_WRITE
39// SEC-NEXT:   ]
40// SEC-NEXT:   Address: 0x2030F0
41// SEC-NEXT:   Offset:
42// SEC-NEXT:   Size: 8
43// SEC-NEXT:   Link: 0
44// SEC-NEXT:   Info: 0
45// SEC-NEXT:   AddressAlignment: 8
46// SEC-NEXT:   EntrySize: 0
47// SEC-NEXT: }
48
49.section       .text,"ax",@progbits,unique,1
50.global _start
51_start:
52  call lulz
53
54.section       .text,"ax",@progbits,unique,2
55.zero 4
56.global lulz
57lulz:
58  nop
59
60// CHECK: Disassembly of section .text:
61// CHECK-NEXT: _start:
62// CHECK-NEXT:   201000:  e8 04 00 00 00   callq 4
63// CHECK-NEXT:   201005:
64
65// CHECK:      lulz:
66// CHECK-NEXT:   201009:  90  nop
67
68
69.section       .text2,"ax",@progbits
70.global R_X86_64_32
71R_X86_64_32:
72  movl $R_X86_64_32, %edx
73
74// FIXME: this would be far more self evident if llvm-objdump printed
75// constants in hex.
76// CHECK: Disassembly of section .text2:
77// CHECK-NEXT: R_X86_64_32:
78// CHECK-NEXT:  20100a: {{.*}} movl $2101258, %edx
79
80.section .R_X86_64_32S,"ax",@progbits
81.global R_X86_64_32S
82R_X86_64_32S:
83  movq lulz - 0x100000, %rdx
84
85// CHECK: Disassembly of section .R_X86_64_32S:
86// CHECK-NEXT: R_X86_64_32S:
87// CHECK-NEXT:  {{.*}}: {{.*}} movq 1052681, %rdx
88
89.section .R_X86_64_PC32,"ax",@progbits
90.global R_X86_64_PC32
91R_X86_64_PC32:
92 call bar
93 movl $bar, %eax
94//16 is a size of PLT[0]
95// 0x201030 + 16 - (0x201017 + 5) = 20
96// CHECK:      Disassembly of section .R_X86_64_PC32:
97// CHECK-NEXT: R_X86_64_PC32:
98// CHECK-NEXT:  201017:   {{.*}}  callq  36
99// CHECK-NEXT:  20101c:   {{.*}}  movl $2101312, %eax
100
101.section .R_X86_64_32S_2,"ax",@progbits
102.global R_X86_64_32S_2
103R_X86_64_32S_2:
104  mov bar2, %eax
105// plt is  at 0x201030. The second plt entry is at 0x201050 == 69712
106// CHECK:      Disassembly of section .R_X86_64_32S_2:
107// CHECK-NEXT: R_X86_64_32S_2:
108// CHECK-NEXT: 201021: {{.*}}  movl    2101328, %eax
109
110.section .R_X86_64_64,"a",@progbits
111.global R_X86_64_64
112R_X86_64_64:
113 .quad R_X86_64_64
114
115// CHECK:      Contents of section .R_X86_64_64:
116// CHECK-NEXT:   2001c8 c8012000 00000000
117
118.section .R_X86_64_GOTPCREL,"a",@progbits
119.global R_X86_64_GOTPCREL
120R_X86_64_GOTPCREL:
121 .long zed@gotpcrel
122
123// 0x2020F8 - 0x2001D8 = 7952
124// 7952 = 0x101f0000 in little endian
125// CHECK:      Contents of section .R_X86_64_GOTPCREL
126// CHECK-NEXT:   2001d0 202f0000
127
128.section .R_X86_64_GOT32,"a",@progbits
129.global R_X86_64_GOT32
130R_X86_64_GOT32:
131        .long zed@got
132
133// CHECK: Contents of section .R_X86_64_GOT32:
134// CHECK-NEXT: f8ffffff
135
136
137// CHECK: Contents of section .R_X86_64_GOT64:
138// CHECK-NEXT: f8ffffff ffffffff
139.section .R_X86_64_GOT64,"a",@progbits
140.global R_X86_64_GOT64
141R_X86_64_GOT64:
142        .quad zed@got
143