1
1
use std:: { collections:: BTreeMap , fs, io:: Cursor , path:: Path } ;
2
2
3
- use anyhow:: { Context , Result } ;
3
+ use anyhow:: { anyhow , bail , Context , Result } ;
4
4
use byteorder:: { BigEndian , ReadBytesExt } ;
5
5
use cwdemangle:: demangle;
6
6
use flagset:: Flags ;
7
7
use object:: {
8
- elf:: {
9
- R_MIPS_26 , R_MIPS_HI16 , R_MIPS_LO16 , R_PPC_ADDR16_HA , R_PPC_ADDR16_HI , R_PPC_ADDR16_LO ,
10
- R_PPC_EMB_SDA21 , R_PPC_REL14 , R_PPC_REL24 ,
11
- } ,
12
- Architecture , File , Object , ObjectSection , ObjectSymbol , RelocationKind , RelocationTarget ,
8
+ elf, Architecture , File , Object , ObjectSection , ObjectSymbol , RelocationKind , RelocationTarget ,
13
9
SectionIndex , SectionKind , Symbol , SymbolKind , SymbolSection ,
14
10
} ;
15
11
@@ -207,27 +203,27 @@ fn relocations_by_section(
207
203
RelocationKind :: Absolute => ObjRelocKind :: Absolute ,
208
204
RelocationKind :: Elf ( kind) => match arch {
209
205
ObjArchitecture :: PowerPc => match kind {
210
- R_PPC_ADDR16_LO => ObjRelocKind :: PpcAddr16Lo ,
211
- R_PPC_ADDR16_HI => ObjRelocKind :: PpcAddr16Hi ,
212
- R_PPC_ADDR16_HA => ObjRelocKind :: PpcAddr16Ha ,
213
- R_PPC_REL24 => ObjRelocKind :: PpcRel24 ,
214
- R_PPC_REL14 => ObjRelocKind :: PpcRel14 ,
215
- R_PPC_EMB_SDA21 => ObjRelocKind :: PpcEmbSda21 ,
206
+ elf :: R_PPC_ADDR16_LO => ObjRelocKind :: PpcAddr16Lo ,
207
+ elf :: R_PPC_ADDR16_HI => ObjRelocKind :: PpcAddr16Hi ,
208
+ elf :: R_PPC_ADDR16_HA => ObjRelocKind :: PpcAddr16Ha ,
209
+ elf :: R_PPC_REL24 => ObjRelocKind :: PpcRel24 ,
210
+ elf :: R_PPC_REL14 => ObjRelocKind :: PpcRel14 ,
211
+ elf :: R_PPC_EMB_SDA21 => ObjRelocKind :: PpcEmbSda21 ,
216
212
_ => {
217
213
return Err ( anyhow:: Error :: msg ( format ! (
218
214
"Unhandled PPC relocation type: {kind}"
219
215
) ) )
220
216
}
221
217
} ,
222
218
ObjArchitecture :: Mips => match kind {
223
- R_MIPS_26 => ObjRelocKind :: Mips26 ,
224
- R_MIPS_HI16 => ObjRelocKind :: MipsHi16 ,
225
- R_MIPS_LO16 => ObjRelocKind :: MipsLo16 ,
226
- _ => {
227
- return Err ( anyhow :: Error :: msg ( format ! (
228
- "Unhandled MIPS relocation type: {kind}"
229
- ) ) )
230
- }
219
+ elf :: R_MIPS_26 => ObjRelocKind :: Mips26 ,
220
+ elf :: R_MIPS_HI16 => ObjRelocKind :: MipsHi16 ,
221
+ elf :: R_MIPS_LO16 => ObjRelocKind :: MipsLo16 ,
222
+ elf :: R_MIPS_GOT16 => ObjRelocKind :: MipsGot16 ,
223
+ elf :: R_MIPS_CALL16 => ObjRelocKind :: MipsCall16 ,
224
+ elf :: R_MIPS_GPREL16 => ObjRelocKind :: MipsGpRel16 ,
225
+ elf :: R_MIPS_GPREL32 => ObjRelocKind :: MipsGpRel32 ,
226
+ _ => bail ! ( "Unhandled MIPS relocation type: {kind}" ) ,
231
227
} ,
232
228
} ,
233
229
_ => {
@@ -244,37 +240,36 @@ fn relocations_by_section(
244
240
}
245
241
_ => None ,
246
242
} ;
247
- // println!("Reloc: {:?}, symbol: {:?}", reloc, symbol);
243
+ let addend = if reloc. has_implicit_addend ( ) {
244
+ let addend = u32:: from_be_bytes (
245
+ section. data [ address as usize ..address as usize + 4 ] . try_into ( ) ?,
246
+ ) ;
247
+ match kind {
248
+ ObjRelocKind :: Absolute => addend as i64 ,
249
+ ObjRelocKind :: MipsHi16 => ( ( addend & 0x0000FFFF ) << 16 ) as i16 as i64 ,
250
+ ObjRelocKind :: MipsLo16
251
+ | ObjRelocKind :: MipsGot16
252
+ | ObjRelocKind :: MipsCall16
253
+ | ObjRelocKind :: MipsGpRel16 => ( addend & 0x0000FFFF ) as i16 as i64 ,
254
+ ObjRelocKind :: MipsGpRel32 => addend as i32 as i64 ,
255
+ ObjRelocKind :: Mips26 => ( ( addend & 0x03FFFFFF ) << 2 ) as i64 ,
256
+ _ => bail ! ( "Unsupported implicit relocation {kind:?}" ) ,
257
+ }
258
+ } else {
259
+ reloc. addend ( )
260
+ } ;
261
+ // println!("Reloc: {reloc:?}, symbol: {symbol:?}, addend: {addend:#X}");
248
262
let target = match symbol. kind ( ) {
249
263
SymbolKind :: Text | SymbolKind :: Data | SymbolKind :: Label | SymbolKind :: Unknown => {
250
- to_obj_symbol ( obj_file, & symbol, reloc . addend ( ) )
264
+ to_obj_symbol ( obj_file, & symbol, addend)
251
265
}
252
266
SymbolKind :: Section => {
253
- let addend = if reloc. has_implicit_addend ( ) {
254
- let addend = u32:: from_be_bytes (
255
- section. data [ address as usize ..address as usize + 4 ] . try_into ( ) ?,
256
- ) ;
257
- match kind {
258
- ObjRelocKind :: Absolute => addend,
259
- ObjRelocKind :: MipsHi16 | ObjRelocKind :: MipsLo16 => addend & 0x0000FFFF ,
260
- ObjRelocKind :: Mips26 => ( addend & 0x03FFFFFF ) * 4 ,
261
- _ => todo ! ( ) ,
262
- }
263
- } else {
264
- let addend = reloc. addend ( ) ;
265
- if addend < 0 {
266
- return Err ( anyhow:: Error :: msg ( format ! (
267
- "Negative addend in section reloc: {addend}"
268
- ) ) ) ;
269
- }
270
- addend as u32
271
- } ;
267
+ if addend < 0 {
268
+ return Err ( anyhow:: Error :: msg ( format ! ( "Negative addend in reloc: {addend}" ) ) ) ;
269
+ }
272
270
find_section_symbol ( obj_file, & symbol, addend as u64 )
273
271
}
274
- _ => Err ( anyhow:: Error :: msg ( format ! (
275
- "Unhandled relocation symbol type {:?}" ,
276
- symbol. kind( )
277
- ) ) ) ,
272
+ kind => Err ( anyhow ! ( "Unhandled relocation symbol type {kind:?}" ) ) ,
278
273
} ?;
279
274
relocations. push ( ObjReloc { kind, address, target, target_section } ) ;
280
275
}
0 commit comments