@@ -46,6 +46,22 @@ pub enum RelocationKind {
46
46
X86CallPLTRel4 ,
47
47
/// x86 GOT PC-relative 4-byte
48
48
X86GOTPCRel4 ,
49
+
50
+ /// R_AARCH64_ADR_PREL_LO21
51
+ Aarch64AdrPrelLo21 ,
52
+
53
+ /// R_AARCH64_ADR_PREL_PG_HI21
54
+ Aarch64AdrPrelPgHi21 ,
55
+
56
+ /// R_AARCH64_ADD_ABS_LO12_NC
57
+ Aarch64AddAbsLo12Nc ,
58
+
59
+ /// R_AARCH64_LDST128_ABS_LO12_NC
60
+ Aarch64Ldst128AbsLo12Nc ,
61
+
62
+ /// R_AARCH64_LDST64_ABS_LO12_NC
63
+ Aarch64Ldst64AbsLo12Nc ,
64
+
49
65
/// Arm32 call target
50
66
Arm32Call ,
51
67
/// Arm64 call target
@@ -102,6 +118,11 @@ impl fmt::Display for RelocationKind {
102
118
Self :: LArchAbsLo12 => write ! ( f, "LArchAbsLo12" ) ,
103
119
Self :: LArchAbs64Hi12 => write ! ( f, "LArchAbs64Hi12" ) ,
104
120
Self :: LArchAbs64Lo20 => write ! ( f, "LArchAbs64Lo20" ) ,
121
+ Self :: Aarch64AdrPrelLo21 => write ! ( f, "Aarch64AdrPrelLo21" ) ,
122
+ Self :: Aarch64AdrPrelPgHi21 => write ! ( f, "Aarch64AdrPrelPgHi21" ) ,
123
+ Self :: Aarch64AddAbsLo12Nc => write ! ( f, "Aarch64AddAbsLo12Nc" ) ,
124
+ Self :: Aarch64Ldst128AbsLo12Nc => write ! ( f, "Aarch64Ldst128AbsLo12Nc" ) ,
125
+ Self :: Aarch64Ldst64AbsLo12Nc => write ! ( f, "Aarch64Ldst64AbsLo12Nc" ) ,
105
126
// Self::MachOX86_64Tlv => write!(f, "MachOX86_64Tlv"),
106
127
}
107
128
}
@@ -142,7 +163,10 @@ pub trait RelocationLike {
142
163
| RelocationKind :: Arm64Movw1
143
164
| RelocationKind :: Arm64Movw2
144
165
| RelocationKind :: Arm64Movw3
145
- | RelocationKind :: RiscvPCRelLo12I => {
166
+ | RelocationKind :: RiscvPCRelLo12I
167
+ | RelocationKind :: Aarch64AddAbsLo12Nc
168
+ | RelocationKind :: Aarch64Ldst128AbsLo12Nc
169
+ | RelocationKind :: Aarch64Ldst64AbsLo12Nc => {
146
170
let reloc_address = start + self . offset ( ) as usize ;
147
171
let reloc_addend = self . addend ( ) as isize ;
148
172
let reloc_abs = target_func_address
@@ -178,14 +202,23 @@ pub trait RelocationLike {
178
202
}
179
203
RelocationKind :: Arm64Call
180
204
| RelocationKind :: RiscvCall
181
- | RelocationKind :: RiscvPCRelHi20 => {
205
+ | RelocationKind :: RiscvPCRelHi20
206
+ | RelocationKind :: Aarch64AdrPrelLo21 => {
182
207
let reloc_address = start + self . offset ( ) as usize ;
183
208
let reloc_addend = self . addend ( ) as isize ;
184
209
let reloc_delta_u32 = target_func_address
185
210
. wrapping_sub ( reloc_address as u64 )
186
211
. wrapping_add ( reloc_addend as u64 ) ;
187
212
( reloc_address, reloc_delta_u32)
188
213
}
214
+ RelocationKind :: Aarch64AdrPrelPgHi21 => {
215
+ let reloc_address = start + self . offset ( ) as usize ;
216
+ let reloc_addend = self . addend ( ) as isize ;
217
+ let target_page =
218
+ ( target_func_address. wrapping_add ( reloc_addend as u64 ) & !( 0xFFF ) ) as usize ;
219
+ let pc_page = reloc_address & !( 0xFFF ) ;
220
+ ( reloc_address, target_page. wrapping_sub ( pc_page) as u64 )
221
+ }
189
222
_ => panic ! ( "Relocation kind unsupported" ) ,
190
223
}
191
224
}
0 commit comments