2 // RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %s -o %t.o
3 // RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %p/Inputs/shared.s -o %t2.o
4 // RUN: ld.lld -shared %t2.o -o %t2.so
5 // RUN: ld.lld %t.o %t2.so -o %t
6 // RUN: llvm-readobj -s -r %t | FileCheck %s
7 // RUN: llvm-objdump -d %t | FileCheck --check-prefix=DISASM %s
8 // RUN: ld.lld -shared %t.o %t2.so -o %t
9 // RUN: llvm-readobj -s -r %t | FileCheck --check-prefix=CHECKSHARED %s
10 // RUN: llvm-objdump -d %t | FileCheck --check-prefix=DISASMSHARED %s
11 // RUN: ld.lld -pie %t.o %t2.so -o %t
12 // RUN: llvm-objdump -d %t | FileCheck --check-prefix=DISASMPIE %s
15 // CHECK-NEXT: Type: SHT_PROGBITS
16 // CHECK-NEXT: Flags [
17 // CHECK-NEXT: SHF_ALLOC
18 // CHECK-NEXT: SHF_EXECINSTR
20 // CHECK-NEXT: Address: 0x11020
21 // CHECK-NEXT: Offset:
22 // CHECK-NEXT: Size: 48
23 // CHECK-NEXT: Link: 0
24 // CHECK-NEXT: Info: 0
25 // CHECK-NEXT: AddressAlignment: 16
27 // CHECK: Name: .got.plt
28 // CHECK-NEXT: Type: SHT_PROGBITS
29 // CHECK-NEXT: Flags [
30 // CHECK-NEXT: SHF_ALLOC
31 // CHECK-NEXT: SHF_WRITE
33 // CHECK-NEXT: Address: 0x12000
34 // CHECK-NEXT: Offset: 0x2000
35 // CHECK-NEXT: Size: 20
36 // CHECK-NEXT: Link: 0
37 // CHECK-NEXT: Info: 0
38 // CHECK-NEXT: AddressAlignment: 4
39 // CHECK-NEXT: EntrySize: 0
41 // 0x12000 + got.plt.reserved(12) = 0x1200C
42 // 0x12000 + got.plt.reserved(12) + 4 = 0x12010
43 // CHECK: Relocations [
44 // CHECK-NEXT: Section ({{.*}}) .rel.plt {
45 // CHECK-NEXT: 0x1200C R_386_JUMP_SLOT bar 0x0
46 // CHECK-NEXT: 0x12010 R_386_JUMP_SLOT zed 0x0
50 // Unfortunately FileCheck can't do math, so we have to check for explicit
53 // 16 is the size of PLT[0]
54 // (0x11010 + 16) - (0x11000 + 1) - 4 = 27
55 // (0x11010 + 16) - (0x11005 + 1) - 4 = 22
56 // (0x11020 + 16) - (0x1100a + 1) - 4 = 33
59 // DISASM-NEXT: 11000: {{.*}}
60 // DISASM-NEXT: 11002: {{.*}}
62 // 0x11013 + 5 - 24 = 0x11000
63 // DISASM-NEXT: 11004: e9 27 00 00 00 jmp 39
64 // DISASM-NEXT: 11009: e9 22 00 00 00 jmp 34
65 // DISASM-NEXT: 1100e: e9 2d 00 00 00 jmp 45
66 // DISASM-NEXT: 11013: e9 e8 ff ff ff jmp -24
68 // 0x11010 - 0x1102b - 5 = -32
69 // 0x11010 - 0x1103b - 5 = -48
70 // 77828 = 0x13004 = .got.plt (0x13000) + 4
71 // 77832 = 0x13008 = .got.plt (0x13000) + 8
72 // 77836 = 0x1300C = .got.plt (0x13000) + got.plt.reserved(12)
73 // 77840 = 0x13010 = .got.plt (0x13000) + got.plt.reserved(12) + 4
74 // DISASM: Disassembly of section .plt:
76 // DISASM-NEXT: 11020: ff 35 04 20 01 00 pushl 73732
77 // DISASM-NEXT: 11026: ff 25 08 20 01 00 jmpl *73736
78 // DISASM-NEXT: 1102c: 90 nop
79 // DISASM-NEXT: 1102d: 90 nop
80 // DISASM-NEXT: 1102e: 90 nop
81 // DISASM-NEXT: 1102f: 90 nop
82 // DISASM-NEXT: 11030: ff 25 0c 20 01 00 jmpl *73740
83 // DISASM-NEXT: 11036: 68 00 00 00 00 pushl $0
84 // DISASM-NEXT: 1103b: e9 e0 ff ff ff jmp -32 <.plt>
85 // DISASM-NEXT: 11040: ff 25 10 20 01 00 jmpl *73744
86 // DISASM-NEXT: 11046: 68 08 00 00 00 pushl $8
87 // DISASM-NEXT: 1104b: e9 d0 ff ff ff jmp -48 <.plt>
89 // CHECKSHARED: Name: .plt
90 // CHECKSHARED-NEXT: Type: SHT_PROGBITS
91 // CHECKSHARED-NEXT: Flags [
92 // CHECKSHARED-NEXT: SHF_ALLOC
93 // CHECKSHARED-NEXT: SHF_EXECINSTR
94 // CHECKSHARED-NEXT: ]
95 // CHECKSHARED-NEXT: Address: 0x1020
96 // CHECKSHARED-NEXT: Offset: 0x1020
97 // CHECKSHARED-NEXT: Size: 48
98 // CHECKSHARED-NEXT: Link: 0
99 // CHECKSHARED-NEXT: Info: 0
100 // CHECKSHARED-NEXT: AddressAlignment: 16
101 // CHECKSHARED-NEXT: EntrySize: 0
102 // CHECKSHARED-NEXT: }
103 // CHECKSHARED: Name: .got.plt
104 // CHECKSHARED-NEXT: Type: SHT_PROGBITS
105 // CHECKSHARED-NEXT: Flags [
106 // CHECKSHARED-NEXT: SHF_ALLOC
107 // CHECKSHARED-NEXT: SHF_WRITE
108 // CHECKSHARED-NEXT: ]
109 // CHECKSHARED-NEXT: Address: 0x2000
110 // CHECKSHARED-NEXT: Offset: 0x2000
111 // CHECKSHARED-NEXT: Size: 20
112 // CHECKSHARED-NEXT: Link: 0
113 // CHECKSHARED-NEXT: Info: 0
114 // CHECKSHARED-NEXT: AddressAlignment: 4
115 // CHECKSHARED-NEXT: EntrySize: 0
116 // CHECKSHARED-NEXT: }
118 // 0x2000 + got.plt.reserved(12) = 0x200C
119 // 0x2000 + got.plt.reserved(12) + 4 = 0x2010
120 // CHECKSHARED: Relocations [
121 // CHECKSHARED-NEXT: Section ({{.*}}) .rel.plt {
122 // CHECKSHARED-NEXT: 0x200C R_386_JUMP_SLOT bar 0x0
123 // CHECKSHARED-NEXT: 0x2010 R_386_JUMP_SLOT zed 0x0
124 // CHECKSHARED-NEXT: }
125 // CHECKSHARED-NEXT: ]
127 // DISASMSHARED: local:
128 // DISASMSHARED-NEXT: 1000: {{.*}}
129 // DISASMSHARED-NEXT: 1002: {{.*}}
130 // DISASMSHARED: _start:
131 // 0x1013 + 5 - 24 = 0x1000
132 // DISASMSHARED-NEXT: 1004: e9 27 00 00 00 jmp 39
133 // DISASMSHARED-NEXT: 1009: e9 22 00 00 00 jmp 34
134 // DISASMSHARED-NEXT: 100e: e9 2d 00 00 00 jmp 45
135 // DISASMSHARED-NEXT: 1013: e9 e8 ff ff ff jmp -24
136 // DISASMSHARED-NEXT: Disassembly of section .plt:
137 // DISASMSHARED-NEXT: .plt:
138 // DISASMSHARED-NEXT: 1020: ff b3 04 20 00 00 pushl 8196(%ebx)
139 // DISASMSHARED-NEXT: 1026: ff a3 08 20 00 00 jmpl *8200(%ebx)
140 // DISASMSHARED-NEXT: 102c: 90 nop
141 // DISASMSHARED-NEXT: 102d: 90 nop
142 // DISASMSHARED-NEXT: 102e: 90 nop
143 // DISASMSHARED-NEXT: 102f: 90 nop
144 // DISASMSHARED-NEXT: 1030: ff a3 0c 20 00 00 jmpl *8204(%ebx)
145 // DISASMSHARED-NEXT: 1036: 68 00 00 00 00 pushl $0
146 // DISASMSHARED-NEXT: 103b: e9 e0 ff ff ff jmp -32 <.plt>
147 // DISASMSHARED-NEXT: 1040: ff a3 10 20 00 00 jmpl *8208(%ebx)
148 // DISASMSHARED-NEXT: 1046: 68 08 00 00 00 pushl $8
149 // DISASMSHARED-NEXT: 104b: e9 d0 ff ff ff jmp -48 <.plt>
151 // DISASMPIE: Disassembly of section .plt:
152 // DISASMPIE-NEXT: .plt:
153 // DISASMPIE-NEXT: 1020: ff b3 04 20 00 00 pushl 8196(%ebx)
154 // DISASMPIE-NEXT: 1026: ff a3 08 20 00 00 jmpl *8200(%ebx)
155 // DISASMPIE-NEXT: 102c: 90 nop
156 // DISASMPIE-NEXT: 102d: 90 nop
157 // DISASMPIE-NEXT: 102e: 90 nop
158 // DISASMPIE-NEXT: 102f: 90 nop
159 // DISASMPIE-NEXT: 1030: ff a3 0c 20 00 00 jmpl *8204(%ebx)
160 // DISASMPIE-NEXT: 1036: 68 00 00 00 00 pushl $0
161 // DISASMPIE-NEXT: 103b: e9 e0 ff ff ff jmp -32 <.plt>
162 // DISASMPIE-NEXT: 1040: ff a3 10 20 00 00 jmpl *8208(%ebx)
163 // DISASMPIE-NEXT: 1046: 68 08 00 00 00 pushl $8
164 // DISASMPIE-NEXT: 104b: e9 d0 ff ff ff jmp -48 <.plt>