From 6ad1442fd59c9fa7d8f97a290a84b5a59671959e Mon Sep 17 00:00:00 2001 From: Philip Craig Date: Sun, 2 May 2021 15:35:43 +1000 Subject: [PATCH] Update object dependency to 0.24.0 --- Cargo.toml | 2 +- crates/as-if-std/Cargo.toml | 2 +- src/symbolize/gimli/coff.rs | 17 ++++++++--------- src/symbolize/gimli/elf.rs | 7 +++---- src/symbolize/gimli/libs_macos.rs | 6 +++--- src/symbolize/gimli/macho.rs | 23 ++++++++++++----------- 6 files changed, 28 insertions(+), 29 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 5b52b64f8..b137e64ad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,7 +39,7 @@ cpp_demangle = { default-features = false, version = "0.3.0", optional = true } addr2line = { version = "0.15.1", optional = true, default-features = false } miniz_oxide = { version = "0.4.0", optional = true, default-features = false } [dependencies.object] -version = "0.23" +version = "0.24" optional = true default-features = false features = ['read_core', 'elf', 'macho', 'pe', 'unaligned', 'archive'] diff --git a/crates/as-if-std/Cargo.toml b/crates/as-if-std/Cargo.toml index 2b81b094c..36adc2033 100644 --- a/crates/as-if-std/Cargo.toml +++ b/crates/as-if-std/Cargo.toml @@ -19,7 +19,7 @@ addr2line = { version = "0.15.1", default-features = false } miniz_oxide = { version = "0.4.0", default-features = false } [dependencies.object] -version = "0.22" +version = "0.24" default-features = false features = ['read_core', 'elf', 'macho', 'pe', 'unaligned', 'archive'] diff --git a/src/symbolize/gimli/coff.rs b/src/symbolize/gimli/coff.rs index 8a6995e13..0c69c5849 100644 --- a/src/symbolize/gimli/coff.rs +++ b/src/symbolize/gimli/coff.rs @@ -3,7 +3,7 @@ use core::convert::TryFrom; use object::pe::{ImageDosHeader, ImageSymbol}; use object::read::pe::{ImageNtHeaders, ImageOptionalHeader, SectionTable}; use object::read::StringTable; -use object::{Bytes, LittleEndian as LE}; +use object::LittleEndian as LE; #[cfg(target_pointer_width = "32")] type Pe = object::pe::ImageNtHeaders32; @@ -18,25 +18,25 @@ impl Mapping { } pub struct Object<'a> { - data: Bytes<'a>, + data: &'a [u8], sections: SectionTable<'a>, symbols: Vec<(usize, &'a ImageSymbol)>, strings: StringTable<'a>, } pub fn get_image_base(data: &[u8]) -> Option { - let data = Bytes(data); let dos_header = ImageDosHeader::parse(data).ok()?; - let (nt_headers, _, _) = dos_header.nt_headers::(data).ok()?; + let mut offset = dos_header.nt_headers_offset().into(); + let (nt_headers, _) = Pe::parse(data, &mut offset).ok()?; usize::try_from(nt_headers.optional_header().image_base()).ok() } impl<'a> Object<'a> { fn parse(data: &'a [u8]) -> Option> { - let data = Bytes(data); let dos_header = ImageDosHeader::parse(data).ok()?; - let (nt_headers, _, nt_tail) = dos_header.nt_headers::(data).ok()?; - let sections = nt_headers.sections(nt_tail).ok()?; + let mut offset = dos_header.nt_headers_offset().into(); + let (nt_headers, _) = Pe::parse(data, &mut offset).ok()?; + let sections = nt_headers.sections(data, offset).ok()?; let symtab = nt_headers.symbols(data).ok()?; let strings = symtab.strings(); let image_base = usize::try_from(nt_headers.optional_header().image_base()).ok()?; @@ -78,8 +78,7 @@ impl<'a> Object<'a> { .section_by_name(self.strings, name.as_bytes())? .1 .pe_data(self.data) - .ok()? - .0, + .ok()?, ) } diff --git a/src/symbolize/gimli/elf.rs b/src/symbolize/gimli/elf.rs index 41a30fe60..ee311a883 100644 --- a/src/symbolize/gimli/elf.rs +++ b/src/symbolize/gimli/elf.rs @@ -29,7 +29,7 @@ pub struct Object<'a> { /// We could use a literal instead, but this helps ensure correctness. endian: NativeEndian, /// The entire file data. - data: Bytes<'a>, + data: &'a [u8], sections: SectionTable<'a, Elf>, strings: StringTable<'a>, /// List of pre-parsed and sorted symbols by base address. @@ -38,7 +38,6 @@ pub struct Object<'a> { impl<'a> Object<'a> { fn parse(data: &'a [u8]) -> Option> { - let data = object::Bytes(data); let elf = Elf::parse(data).ok()?; let endian = elf.endian().ok()?; let sections = elf.sections(endian, data).ok()?; @@ -90,7 +89,7 @@ impl<'a> Object<'a> { pub fn section(&self, stash: &'a Stash, name: &str) -> Option<&'a [u8]> { if let Some(section) = self.section_header(name) { - let mut data = section.data(self.endian, self.data).ok()?; + let mut data = Bytes(section.data(self.endian, self.data).ok()?); // Check for DWARF-standard (gABI) compression, i.e., as generated // by ld's `--compress-debug-sections=zlib-gabi` flag. @@ -131,7 +130,7 @@ impl<'a> Object<'a> { } }) .next()?; - let mut data = compressed_section.data(self.endian, self.data).ok()?; + let mut data = Bytes(compressed_section.data(self.endian, self.data).ok()?); if data.read_bytes(8).ok()?.0 != b"ZLIB\0\0\0\0" { return None; } diff --git a/src/symbolize/gimli/libs_macos.rs b/src/symbolize/gimli/libs_macos.rs index 2b6b6716f..1c58a819c 100644 --- a/src/symbolize/gimli/libs_macos.rs +++ b/src/symbolize/gimli/libs_macos.rs @@ -19,7 +19,7 @@ pub(super) fn native_libraries() -> Vec { fn native_library(i: u32) -> Option { use object::macho; use object::read::macho::{MachHeader, Segment}; - use object::{Bytes, NativeEndian}; + use object::NativeEndian; // Fetch the name of this library which corresponds to the path of // where to load it as well. @@ -47,7 +47,7 @@ fn native_library(i: u32) -> Option { header as *const _ as *const u8, mem::size_of_val(header) + header.sizeofcmds.get(endian) as usize, ); - (header.load_commands(endian, Bytes(data)).ok()?, endian) + (header.load_commands(endian, data).ok()?, endian) } macho::MH_MAGIC_64 => { let endian = NativeEndian; @@ -56,7 +56,7 @@ fn native_library(i: u32) -> Option { header as *const _ as *const u8, mem::size_of_val(header) + header.sizeofcmds.get(endian) as usize, ); - (header.load_commands(endian, Bytes(data)).ok()?, endian) + (header.load_commands(endian, data).ok()?, endian) } _ => return None, } diff --git a/src/symbolize/gimli/macho.rs b/src/symbolize/gimli/macho.rs index 4b96bf16c..cdd24bdde 100644 --- a/src/symbolize/gimli/macho.rs +++ b/src/symbolize/gimli/macho.rs @@ -20,7 +20,7 @@ impl Mapping { // First up we need to load the unique UUID which is stored in the macho // header of the file we're reading, specified at `path`. let map = super::mmap(path)?; - let (macho, data) = find_header(Bytes(&map))?; + let (macho, data) = find_header(&map)?; let endian = macho.endian().ok()?; let uuid = macho.uuid(endian, data).ok()??; @@ -40,7 +40,7 @@ impl Mapping { // file. This should have the symbol table for at least some // symbolication purposes. Mapping::mk(map, |data, stash| { - let (macho, data) = find_header(Bytes(data))?; + let (macho, data) = find_header(data)?; let endian = macho.endian().ok()?; let obj = Object::parse(macho, endian, data)?; Context::new(stash, obj) @@ -73,7 +73,7 @@ impl Mapping { let entry = entry.ok()?; let map = super::mmap(&entry.path())?; let candidate = Mapping::mk(map, |data, stash| { - let (macho, data) = find_header(Bytes(data))?; + let (macho, data) = find_header(data)?; let endian = macho.endian().ok()?; let entry_uuid = macho.uuid(endian, data).ok()??; if entry_uuid != uuid { @@ -91,7 +91,7 @@ impl Mapping { } } -fn find_header(mut data: Bytes<'_>) -> Option<(&'_ Mach, Bytes<'_>)> { +fn find_header(data: &'_ [u8]) -> Option<(&'_ Mach, &'_ [u8])> { use object::endian::BigEndian; let desired_cpu = || { @@ -108,6 +108,7 @@ fn find_header(mut data: Bytes<'_>) -> Option<(&'_ Mach, Bytes<'_>)> { } }; + let mut data = Bytes(data); match data .clone() .read::>() @@ -149,13 +150,13 @@ fn find_header(mut data: Bytes<'_>) -> Option<(&'_ Mach, Bytes<'_>)> { _ => return None, } - Mach::parse(data).ok().map(|h| (h, data)) + Mach::parse(data.0).ok().map(|h| (h, data.0)) } // This is used both for executables/libraries and source object files. pub struct Object<'a> { endian: NativeEndian, - data: Bytes<'a>, + data: &'a [u8], dwarf: Option<&'a [MachSection]>, syms: Vec<(&'a [u8], u64)>, syms_sort_by_name: bool, @@ -166,7 +167,7 @@ pub struct Object<'a> { } impl<'a> Object<'a> { - fn parse(mach: &'a Mach, endian: NativeEndian, data: Bytes<'a>) -> Option> { + fn parse(mach: &'a Mach, endian: NativeEndian, data: &'a [u8]) -> Option> { let is_object = mach.filetype(endian) == object::macho::MH_OBJECT; let mut dwarf = None; let mut syms = Vec::new(); @@ -181,7 +182,7 @@ impl<'a> Object<'a> { dwarf = segment.sections(endian, section_data).ok(); } } else if let Some(symtab) = command.symtab().ok()? { - let symbols = symtab.symbols::(endian, data).ok()?; + let symbols = symtab.symbols::(endian, data).ok()?; syms = symbols .iter() .filter_map(|nlist: &MachNlist| { @@ -230,7 +231,7 @@ impl<'a> Object<'a> { && §ion_name[2..] == &name[1..] } })?; - Some(section.data(self.endian, self.data).ok()?.0) + Some(section.data(self.endian, self.data).ok()?) } pub fn search_symtab<'b>(&'b self, addr: u64) -> Option<&'b [u8]> { @@ -299,9 +300,9 @@ fn object_mapping(path: &[u8]) -> Option { .members() .filter_map(Result::ok) .find(|m| m.name() == member_name)?; - Bytes(member.data()) + member.data(data).ok()? } - None => Bytes(data), + None => data, }; let (macho, data) = find_header(data)?; let endian = macho.endian().ok()?;