]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/ELF/plt-i686.s
Vendor import of lld trunk r338150:
[FreeBSD/FreeBSD.git] / test / ELF / plt-i686.s
1 // REQUIRES: x86
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
13
14 // CHECK:      Name: .plt
15 // CHECK-NEXT: Type: SHT_PROGBITS
16 // CHECK-NEXT: Flags [
17 // CHECK-NEXT:   SHF_ALLOC
18 // CHECK-NEXT:   SHF_EXECINSTR
19 // CHECK-NEXT: ]
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
26
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
32 // CHECK-NEXT: ]
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
40
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
47 // CHECK-NEXT:   }
48 // CHECK-NEXT: ]
49
50 // Unfortunately FileCheck can't do math, so we have to check for explicit
51 // values:
52
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
57
58 // DISASM:       local:
59 // DISASM-NEXT:  11000: {{.*}}
60 // DISASM-NEXT:  11002: {{.*}}
61 // DISASM:       _start:
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
67
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:
75 // DISASM-NEXT: .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>
88
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:   }
117
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:   ]
126
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>
150
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>
165
166 local:
167 .long 0
168
169 .global _start
170 _start:
171   jmp bar@PLT
172   jmp bar@PLT
173   jmp zed@PLT
174   jmp local@plt