Skip to content

Commit

Permalink
DyldCache: add the ability to iterate mappings and relocations for mo…
Browse files Browse the repository at this point in the history
…dern dyld shared cache's
  • Loading branch information
scollinson committed Oct 22, 2024
1 parent 61dc7b0 commit cd1bc46
Show file tree
Hide file tree
Showing 7 changed files with 958 additions and 104 deletions.
7 changes: 7 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ ruzstd = { version = "0.7.0", optional = true }
core = { version = '1.0.0', optional = true, package = 'rustc-std-workspace-core' }
compiler_builtins = { version = '0.1.2', optional = true }
alloc = { version = '1.0.0', optional = true, package = 'rustc-std-workspace-alloc' }
bitfield = "0.17.0"

[features]
#=======================================
Expand Down
35 changes: 16 additions & 19 deletions crates/examples/src/readobj/macho.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ pub(super) fn print_dyld_cache(p: &mut Printer<'_>, data: &[u8]) {
if let Some((_, endian)) = header.parse_magic().print_err(p) {
print_dyld_cache_header(p, endian, header);
let mappings = header.mappings(endian, data).print_err(p);
if let Some(mappings) = mappings {
print_dyld_cache_mappings(p, endian, mappings);
if let Some(mappings) = &mappings {
print_dyld_cache_mappings(p, mappings);
}
if let Some(images) = header.images(endian, data).print_err(p) {
print_dyld_cache_images(p, endian, data, mappings, images);
Expand All @@ -36,23 +36,19 @@ pub(super) fn print_dyld_cache_header(
});
}

pub(super) fn print_dyld_cache_mappings(
p: &mut Printer<'_>,
endian: Endianness,
mappings: &[DyldCacheMappingInfo<Endianness>],
) {
pub(super) fn print_dyld_cache_mappings(p: &mut Printer<'_>, mappings: &DyldCacheMappingSlice) {
if !p.options.file {
return;
}
for mapping in mappings {
p.group("DyldCacheMappingInfo", |p| {
p.field_hex("Address", mapping.address.get(endian));
p.field_hex("Size", mapping.size.get(endian));
p.field_hex("FileOffset", mapping.file_offset.get(endian));
p.field_hex("MaxProt", mapping.max_prot.get(endian));
p.flags(mapping.max_prot.get(endian), 0, FLAGS_VM);
p.field_hex("InitProt", mapping.init_prot.get(endian));
p.flags(mapping.init_prot.get(endian), 0, FLAGS_VM);
for mapping in mappings.iter() {
p.group("DyldCacheMapping", |p| {
p.field_hex("Address", mapping.address());
p.field_hex("Size", mapping.size());
p.field_hex("FileOffset", mapping.file_offset());
p.field_hex("MaxProt", mapping.max_prot());
p.flags(mapping.max_prot(), 0, FLAGS_VM);
p.field_hex("InitProt", mapping.init_prot());
p.flags(mapping.init_prot(), 0, FLAGS_VM);
});
}
}
Expand All @@ -61,7 +57,7 @@ pub(super) fn print_dyld_cache_images(
p: &mut Printer<'_>,
endian: Endianness,
data: &[u8],
mappings: Option<&[DyldCacheMappingInfo<Endianness>]>,
mappings: Option<DyldCacheMappingSlice>,
images: &[DyldCacheImageInfo<Endianness>],
) {
for image in images {
Expand All @@ -78,8 +74,9 @@ pub(super) fn print_dyld_cache_images(
p.field_hex("Pad", image.pad.get(endian));
});
}
if let Some(offset) =
mappings.and_then(|mappings| image.file_offset(endian, mappings).print_err(p))
if let Some(offset) = mappings
.as_ref()
.and_then(|mappings| image.file_offset(endian, mappings).print_err(p))
{
if p.options.file {
p.blank();
Expand Down
Loading

0 comments on commit cd1bc46

Please sign in to comment.