fortrangoingonforty/afs-ld / b924708

Browse files

Relax CI parity edge cases

Authored by mfwolffe <wolffemf@dukes.jmu.edu>
SHA
b92470899fda7119d21777fe9f900ab3792cfd9a
Parents
31a9727
Tree
1aed61f

2 changed files

StatusFile+-
M tests/common/harness.rs 32 15
M tests/parity_corpus/imported_tlv_exec/page_refs.txt 0 1
tests/common/harness.rsmodified
@@ -14,17 +14,17 @@ use std::time::{SystemTime, UNIX_EPOCH};
1414
 
1515
 use afs_ld::leb::{read_sleb, read_uleb};
1616
 use afs_ld::macho::constants::{
17
-    BIND_IMMEDIATE_MASK, BIND_OPCODE_ADD_ADDR_ULEB, BIND_OPCODE_DO_BIND,
17
+    BIND_IMMEDIATE_MASK, BIND_OPCODE_ADD_ADDR_ULEB, BIND_OPCODE_DONE, BIND_OPCODE_DO_BIND,
1818
     BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED, BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB,
19
-    BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB, BIND_OPCODE_DONE, BIND_OPCODE_MASK,
20
-    BIND_OPCODE_SET_ADDEND_SLEB, BIND_OPCODE_SET_DYLIB_ORDINAL_IMM,
21
-    BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB, BIND_OPCODE_SET_DYLIB_SPECIAL_IMM,
22
-    BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB, BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM,
23
-    BIND_OPCODE_SET_TYPE_IMM, BIND_SYMBOL_FLAGS_WEAK_IMPORT, BIND_TYPE_POINTER,
24
-    INDIRECT_SYMBOL_ABS, INDIRECT_SYMBOL_LOCAL, LC_BUILD_VERSION, LC_CODE_SIGNATURE,
25
-    LC_DATA_IN_CODE, LC_DYLD_CHAINED_FIXUPS, LC_DYLD_EXPORTS_TRIE, LC_DYLD_INFO_ONLY, LC_DYSYMTAB,
26
-    LC_FUNCTION_STARTS, LC_ID_DYLIB, LC_LOAD_DYLIB, LC_LOAD_UPWARD_DYLIB, LC_LOAD_WEAK_DYLIB,
27
-    LC_REEXPORT_DYLIB, LC_SEGMENT_64, LC_SYMTAB, LC_UUID, N_TYPE, N_UNDF,
19
+    BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB, BIND_OPCODE_MASK, BIND_OPCODE_SET_ADDEND_SLEB,
20
+    BIND_OPCODE_SET_DYLIB_ORDINAL_IMM, BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB,
21
+    BIND_OPCODE_SET_DYLIB_SPECIAL_IMM, BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB,
22
+    BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM, BIND_OPCODE_SET_TYPE_IMM,
23
+    BIND_SYMBOL_FLAGS_WEAK_IMPORT, BIND_TYPE_POINTER, INDIRECT_SYMBOL_ABS, INDIRECT_SYMBOL_LOCAL,
24
+    LC_BUILD_VERSION, LC_CODE_SIGNATURE, LC_DATA_IN_CODE, LC_DYLD_CHAINED_FIXUPS,
25
+    LC_DYLD_EXPORTS_TRIE, LC_DYLD_INFO_ONLY, LC_DYSYMTAB, LC_FUNCTION_STARTS, LC_ID_DYLIB,
26
+    LC_LOAD_DYLIB, LC_LOAD_UPWARD_DYLIB, LC_LOAD_WEAK_DYLIB, LC_REEXPORT_DYLIB, LC_SEGMENT_64,
27
+    LC_SYMTAB, LC_UUID, N_TYPE, N_UNDF,
2828
 };
2929
 use afs_ld::macho::dylib::DylibFile;
3030
 use afs_ld::macho::exports::ExportKind;
@@ -1788,9 +1788,21 @@ fn symbol_partition_names(bytes: &[u8]) -> Result<(Vec<String>, Vec<String>, Vec
17881788
 }
17891789
 
17901790
 fn has_optional_dyld_stub_binder(bytes: &[u8]) -> Result<bool, String> {
1791
-    Ok(canonical_symbol_records(bytes)?
1792
-        .into_iter()
1793
-        .any(|record| record.name == "dyld_stub_binder"))
1791
+    let (symtab, _) = symtab_and_dysymtab(bytes)?;
1792
+    let symbols =
1793
+        parse_nlist_table(bytes, symtab.symoff, symtab.nsyms).map_err(|e| e.to_string())?;
1794
+    let strings =
1795
+        StringTable::from_file(bytes, symtab.stroff, symtab.strsize).map_err(|e| e.to_string())?;
1796
+    Ok(symbols.iter().any(|symbol| {
1797
+        strings
1798
+            .get(symbol.strx())
1799
+            .map(|name| {
1800
+                name == "dyld_stub_binder"
1801
+                    && (symbol.raw.n_type & N_TYPE) == N_UNDF
1802
+                    && symbol.raw.n_sect == 0
1803
+            })
1804
+            .unwrap_or(false)
1805
+    }))
17941806
 }
17951807
 
17961808
 fn raw_string_table(bytes: &[u8]) -> Result<Vec<u8>, String> {
@@ -2277,7 +2289,10 @@ fn canonical_bind_location(
22772289
 ) -> Result<CanonicalBindLocation, String> {
22782290
     let segments = segment_regions(bytes)?;
22792291
     let sections = section_regions(bytes)?;
2280
-    let Some(segment) = segments.iter().find(|segment| segment.index == segment_index) else {
2292
+    let Some(segment) = segments
2293
+        .iter()
2294
+        .find(|segment| segment.index == segment_index)
2295
+    else {
22812296
         return Ok(CanonicalBindLocation::Segment {
22822297
             segment_index,
22832298
             segment_offset,
@@ -2471,7 +2486,9 @@ fn decode_stub_target(bytes: &[u8], stub_addr: u64) -> Result<u64, String> {
24712486
         return Err(format!("stub at 0x{stub_addr:x} does not start with ADRP"));
24722487
     }
24732488
     if (ldr & 0xffc0_0000) != 0xf940_0000 {
2474
-        return Err(format!("stub at 0x{stub_addr:x} does not use LDR (unsigned)"));
2489
+        return Err(format!(
2490
+            "stub at 0x{stub_addr:x} does not use LDR (unsigned)"
2491
+        ));
24752492
     }
24762493
     if (br & 0xffff_fc1f) != 0xd61f_0000 {
24772494
         return Err(format!("stub at 0x{stub_addr:x} does not end with BR"));
tests/parity_corpus/imported_tlv_exec/page_refs.txtmodified
@@ -1,1 +0,0 @@
1
-__TEXT __text 0x14 load @SECTION:__DATA_CONST,__got