@@ -1240,6 +1240,7 @@ fn collect_rebase_sites( |
| 1240 | 1240 | .iter() |
| 1241 | 1241 | .map(|input| (input.id, input.object)) |
| 1242 | 1242 | .collect(); |
| 1243 | + let symbol_name_index = build_symbol_name_index(inputs.0.sym_table); |
| 1243 | 1244 | |
| 1244 | 1245 | for section in &layout.sections { |
| 1245 | 1246 | if !matches!(section.segment.as_str(), "__DATA" | "__DATA_CONST") { |
@@ -1264,7 +1265,7 @@ fn collect_rebase_sites( |
| 1264 | 1265 | .map(Vec::as_slice) |
| 1265 | 1266 | .unwrap_or(&[]); |
| 1266 | 1267 | for reloc in relocs_for_rebase(relocs, atom) { |
| 1267 | | - if !reloc_needs_rebase(obj, reloc, inputs.0.sym_table) { |
| 1268 | + if !reloc_needs_rebase(obj, reloc, inputs.0.sym_table, &symbol_name_index) { |
| 1268 | 1269 | continue; |
| 1269 | 1270 | } |
| 1270 | 1271 | let local_offset = reloc.offset.saturating_sub(atom.input_offset) as u64; |
@@ -1349,7 +1350,12 @@ fn relocs_for_rebase<'a>( |
| 1349 | 1350 | }) |
| 1350 | 1351 | } |
| 1351 | 1352 | |
| 1352 | | -fn reloc_needs_rebase(obj: &ObjectFile, reloc: Reloc, sym_table: &SymbolTable) -> bool { |
| 1353 | +fn reloc_needs_rebase( |
| 1354 | + obj: &ObjectFile, |
| 1355 | + reloc: Reloc, |
| 1356 | + sym_table: &SymbolTable, |
| 1357 | + symbol_name_index: &HashMap<String, SymbolId>, |
| 1358 | +) -> bool { |
| 1353 | 1359 | if reloc.kind != RelocKind::Unsigned |
| 1354 | 1360 | || reloc.length != RelocLength::Quad |
| 1355 | 1361 | || reloc.pcrel |
@@ -1364,7 +1370,7 @@ fn reloc_needs_rebase(obj: &ObjectFile, reloc: Reloc, sym_table: &SymbolTable) - |
| 1364 | 1370 | let Some(input_sym) = obj.symbols.get(sym_idx as usize) else { |
| 1365 | 1371 | return false; |
| 1366 | 1372 | }; |
| 1367 | | - match symbol_referent_id(obj, reloc.referent, sym_table) { |
| 1373 | + match symbol_referent_id(obj, reloc.referent, symbol_name_index) { |
| 1368 | 1374 | Some(symbol_id) => match sym_table.get(symbol_id) { |
| 1369 | 1375 | Symbol::DylibImport { .. } => false, |
| 1370 | 1376 | Symbol::Defined { atom, .. } => atom.0 != 0, |
@@ -1377,20 +1383,29 @@ fn reloc_needs_rebase(obj: &ObjectFile, reloc: Reloc, sym_table: &SymbolTable) - |
| 1377 | 1383 | } |
| 1378 | 1384 | } |
| 1379 | 1385 | |
| 1386 | +fn build_symbol_name_index(sym_table: &SymbolTable) -> HashMap<String, SymbolId> { |
| 1387 | + sym_table |
| 1388 | + .iter() |
| 1389 | + .map(|(symbol_id, symbol)| { |
| 1390 | + ( |
| 1391 | + sym_table.interner.resolve(symbol.name()).to_string(), |
| 1392 | + symbol_id, |
| 1393 | + ) |
| 1394 | + }) |
| 1395 | + .collect() |
| 1396 | +} |
| 1397 | + |
| 1380 | 1398 | fn symbol_referent_id( |
| 1381 | 1399 | obj: &ObjectFile, |
| 1382 | 1400 | referent: Referent, |
| 1383 | | - sym_table: &SymbolTable, |
| 1401 | + symbol_name_index: &HashMap<String, SymbolId>, |
| 1384 | 1402 | ) -> Option<SymbolId> { |
| 1385 | 1403 | let Referent::Symbol(sym_idx) = referent else { |
| 1386 | 1404 | return None; |
| 1387 | 1405 | }; |
| 1388 | 1406 | let input_sym = obj.symbols.get(sym_idx as usize)?; |
| 1389 | 1407 | let name = obj.symbol_name(input_sym).ok()?; |
| 1390 | | - let (symbol_id, _) = sym_table |
| 1391 | | - .iter() |
| 1392 | | - .find(|(_, symbol)| sym_table.interner.resolve(symbol.name()) == name)?; |
| 1393 | | - Some(symbol_id) |
| 1408 | + symbol_name_index.get(name).copied() |
| 1394 | 1409 | } |
| 1395 | 1410 | |
| 1396 | 1411 | fn build_function_starts( |