150
|
1 // REQUIRES: arm
|
|
2 // RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %s -o %t.o
|
|
3 // RUN: ld.lld %t.o -o %t
|
173
|
4 // RUN: llvm-objdump --triple=armv7a-none-linux-gnueabi -d --no-show-raw-insn %t | FileCheck %s --check-prefix=DISASM
|
150
|
5 // RUN: llvm-readobj -r --symbols --sections %t | FileCheck %s
|
|
6 .syntax unified
|
|
7 .text
|
|
8 .type foo STT_GNU_IFUNC
|
|
9 .globl foo
|
|
10 foo:
|
|
11 bx lr
|
|
12
|
|
13 .type bar STT_GNU_IFUNC
|
|
14 .globl bar
|
|
15 bar:
|
|
16 bx lr
|
|
17
|
|
18 .globl _start
|
|
19 _start:
|
|
20 bl foo
|
|
21 bl bar
|
|
22 movw r0,:lower16:__rel_iplt_start
|
|
23 movt r0,:upper16:__rel_iplt_start
|
|
24 movw r0,:lower16:__rel_iplt_end
|
|
25 movt r0,:upper16:__rel_iplt_end
|
|
26
|
|
27 // CHECK: Sections [
|
|
28 // CHECK: Section {
|
|
29 // CHECK: Section {
|
|
30 // CHECK: Name: .rel.dyn
|
|
31 // CHECK-NEXT: Type: SHT_REL
|
|
32 // CHECK-NEXT: Flags [
|
|
33 // CHECK-NEXT: SHF_ALLOC
|
|
34 // CHECK-NEXT: ]
|
|
35 // CHECK-NEXT: Address: 0x100F4
|
|
36 // CHECK-NEXT: Offset: 0xF4
|
|
37 // CHECK-NEXT: Size: 16
|
|
38 // CHECK-NEXT: Link:
|
|
39 // CHECK-NEXT: Info: 4
|
|
40 // CHECK: Name: .iplt
|
|
41 // CHECK-NEXT: Type: SHT_PROGBITS
|
|
42 // CHECK-NEXT: Flags [
|
|
43 // CHECK-NEXT: SHF_ALLOC
|
|
44 // CHECK-NEXT: SHF_EXECINSTR
|
|
45 // CHECK-NEXT: ]
|
173
|
46 // CHECK-NEXT: Address: 0x20130
|
150
|
47 // CHECK-NEXT: Offset: 0x130
|
|
48 // CHECK-NEXT: Size: 32
|
|
49 // CHECK: Index: 4
|
|
50 // CHECK-NEXT: Name: .got
|
|
51 // CHECK-NEXT: Type: SHT_PROGBITS
|
|
52 // CHECK-NEXT: Flags [
|
|
53 // CHECK-NEXT: SHF_ALLOC
|
|
54 // CHECK-NEXT: SHF_WRITE
|
|
55 // CHECK-NEXT: ]
|
173
|
56 // CHECK-NEXT: Address: 0x30150
|
150
|
57 // CHECK-NEXT: Offset: 0x150
|
|
58 // CHECK-NEXT: Size: 8
|
|
59 // CHECK: Relocations [
|
|
60 // CHECK-NEXT: Section (1) .rel.dyn {
|
173
|
61 // CHECK-NEXT: 0x30150 R_ARM_IRELATIVE
|
|
62 // CHECK-NEXT: 0x30154 R_ARM_IRELATIVE
|
150
|
63 // CHECK-NEXT: }
|
|
64 // CHECK-NEXT: ]
|
|
65 // CHECK: Symbol {
|
|
66 // CHECK: Name: __rel_iplt_end
|
|
67 // CHECK-NEXT: Value: 0x10104
|
|
68 // CHECK-NEXT: Size: 0
|
|
69 // CHECK-NEXT: Binding: Local
|
|
70 // CHECK-NEXT: Type: None
|
|
71 // CHECK-NEXT: Other [
|
|
72 // CHECK-NEXT: STV_HIDDEN
|
|
73 // CHECK-NEXT: ]
|
|
74 // CHECK-NEXT: Section: .rel.dyn
|
|
75 // CHECK-NEXT: }
|
|
76 // CHECK-NEXT: Symbol {
|
|
77 // CHECK-NEXT: Name: __rel_iplt_start
|
|
78 // CHECK-NEXT: Value: 0x100F4
|
|
79 // CHECK-NEXT: Size: 0
|
|
80 // CHECK-NEXT: Binding: Local
|
|
81 // CHECK-NEXT: Type: None
|
|
82 // CHECK-NEXT: Other [
|
|
83 // CHECK-NEXT: STV_HIDDEN
|
|
84 // CHECK-NEXT: ]
|
|
85 // CHECK-NEXT: Section: .rel.dyn
|
|
86 // CHECK-NEXT: }
|
|
87 // CHECK-NEXT: Symbol {
|
|
88 // CHECK-NEXT: Name: _start
|
173
|
89 // CHECK-NEXT: Value: 0x2010C
|
150
|
90 // CHECK-NEXT: Size: 0
|
|
91 // CHECK-NEXT: Binding: Global
|
|
92 // CHECK-NEXT: Type: None
|
|
93 // CHECK-NEXT: Other:
|
|
94 // CHECK-NEXT: Section: .text
|
|
95 // CHECK-NEXT: }
|
|
96 // CHECK-NEXT: Symbol {
|
|
97 // CHECK-NEXT: Name: bar
|
173
|
98 // CHECK-NEXT: Value: 0x20108
|
150
|
99 // CHECK-NEXT: Size: 0
|
|
100 // CHECK-NEXT: Binding: Global
|
|
101 // CHECK-NEXT: Type: GNU_IFunc
|
|
102 // CHECK-NEXT: Other: 0
|
|
103 // CHECK-NEXT: Section: .text
|
|
104 // CHECK-NEXT: }
|
|
105 // CHECK-NEXT: Symbol {
|
|
106 // CHECK-NEXT: Name: foo
|
173
|
107 // CHECK-NEXT: Value: 0x20104
|
150
|
108 // CHECK-NEXT: Size: 0
|
|
109 // CHECK-NEXT: Binding: Global
|
|
110 // CHECK-NEXT: Type: GNU_IFunc
|
|
111 // CHECK-NEXT: Other: 0
|
|
112 // CHECK-NEXT: Section: .text
|
|
113 // CHECK-NEXT: }
|
|
114
|
|
115 // DISASM: Disassembly of section .text:
|
|
116 // DISASM-EMPTY:
|
173
|
117 // DISASM-NEXT: <foo>:
|
|
118 // DISASM-NEXT: 20104: bx lr
|
|
119 // DISASM: <bar>:
|
|
120 // DISASM-NEXT: 20108: bx lr
|
|
121 // DISASM: <_start>:
|
|
122 // DISASM-NEXT: 2010c: bl #28
|
|
123 // DISASM-NEXT: 20110: bl #40
|
150
|
124 // 1 * 65536 + 244 = 0x100f4 __rel_iplt_start
|
173
|
125 // DISASM-NEXT: 20114: movw r0, #244
|
|
126 // DISASM-NEXT: 20118: movt r0, #1
|
150
|
127 // 1 * 65536 + 260 = 0x10104 __rel_iplt_end
|
173
|
128 // DISASM-NEXT: 2011c: movw r0, #260
|
|
129 // DISASM-NEXT: 20120: movt r0, #1
|
150
|
130 // DISASM-EMPTY:
|
|
131 // DISASM-NEXT: Disassembly of section .iplt:
|
|
132 // DISASM-EMPTY:
|
173
|
133 // DISASM-NEXT: <$a>:
|
|
134 // DISASM-NEXT: 20130: add r12, pc, #0, #12
|
|
135 // DISASM-NEXT: 20134: add r12, r12, #16
|
|
136 // DISASM-NEXT: 20138: ldr pc, [r12, #24]!
|
|
137 // DISASM: <$d>:
|
|
138 // DISASM-NEXT: 2013c: d4 d4 d4 d4 .word 0xd4d4d4d4
|
|
139 // DISASM: <$a>:
|
|
140 // DISASM-NEXT: 20140: add r12, pc, #0, #12
|
|
141 // DISASM-NEXT: 20144: add r12, r12, #16
|
|
142 // DISASM-NEXT: 20148: ldr pc, [r12, #12]!
|
|
143 // DISASM: <$d>:
|
|
144 // DISASM-NEXT: 2014c: d4 d4 d4 d4 .word 0xd4d4d4d4
|
150
|
145
|