fortrangoingonforty/afs-ld / 9dbf0eb

Browse files

Cache rebase symbol lookups

Authored by mfwolffe <wolffemf@dukes.jmu.edu>
SHA
9dbf0eb3a8e185ceb59830ed53990ce9b3ca8da3
Parents
86f5fa3
Tree
6bdc462

1 changed file

StatusFile+-
M src/macho/writer.rs 23 8
src/macho/writer.rsmodified
@@ -1240,6 +1240,7 @@ fn collect_rebase_sites(
12401240
         .iter()
12411241
         .map(|input| (input.id, input.object))
12421242
         .collect();
1243
+    let symbol_name_index = build_symbol_name_index(inputs.0.sym_table);
12431244
 
12441245
     for section in &layout.sections {
12451246
         if !matches!(section.segment.as_str(), "__DATA" | "__DATA_CONST") {
@@ -1264,7 +1265,7 @@ fn collect_rebase_sites(
12641265
                 .map(Vec::as_slice)
12651266
                 .unwrap_or(&[]);
12661267
             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) {
12681269
                     continue;
12691270
                 }
12701271
                 let local_offset = reloc.offset.saturating_sub(atom.input_offset) as u64;
@@ -1349,7 +1350,12 @@ fn relocs_for_rebase<'a>(
13491350
     })
13501351
 }
13511352
 
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 {
13531359
     if reloc.kind != RelocKind::Unsigned
13541360
         || reloc.length != RelocLength::Quad
13551361
         || reloc.pcrel
@@ -1364,7 +1370,7 @@ fn reloc_needs_rebase(obj: &ObjectFile, reloc: Reloc, sym_table: &SymbolTable) -
13641370
             let Some(input_sym) = obj.symbols.get(sym_idx as usize) else {
13651371
                 return false;
13661372
             };
1367
-            match symbol_referent_id(obj, reloc.referent, sym_table) {
1373
+            match symbol_referent_id(obj, reloc.referent, symbol_name_index) {
13681374
                 Some(symbol_id) => match sym_table.get(symbol_id) {
13691375
                     Symbol::DylibImport { .. } => false,
13701376
                     Symbol::Defined { atom, .. } => atom.0 != 0,
@@ -1377,20 +1383,29 @@ fn reloc_needs_rebase(obj: &ObjectFile, reloc: Reloc, sym_table: &SymbolTable) -
13771383
     }
13781384
 }
13791385
 
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
+
13801398
 fn symbol_referent_id(
13811399
     obj: &ObjectFile,
13821400
     referent: Referent,
1383
-    sym_table: &SymbolTable,
1401
+    symbol_name_index: &HashMap<String, SymbolId>,
13841402
 ) -> Option<SymbolId> {
13851403
     let Referent::Symbol(sym_idx) = referent else {
13861404
         return None;
13871405
     };
13881406
     let input_sym = obj.symbols.get(sym_idx as usize)?;
13891407
     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()
13941409
 }
13951410
 
13961411
 fn build_function_starts(