diff --git a/Cargo.lock b/Cargo.lock index 6ebda9ea..a6a0ed6f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -124,9 +124,9 @@ dependencies = [ [[package]] name = "object" -version = "0.39.1" +version = "0.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e5a6c098c7a3b6547378093f5cc30bc54fd361ce711e05293a5cc589562739b" +checksum = "dd229a0361b9d0d4396176e02d65897f487eebeab7caa6d443855ee152ca0b9c" dependencies = [ "memchr", ] diff --git a/Cargo.toml b/Cargo.toml index b828cc27..76c4d24a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,7 +48,7 @@ addr2line = { version = "0.25.0", default-features = false } libc = { version = "0.2.156", default-features = false } [target.'cfg(not(all(windows, target_env = "msvc", not(target_vendor = "uwp"))))'.dependencies.object] -version = "0.39.0" +version = "0.40.0" default-features = false features = ['read_core', 'elf', 'macho', 'pe', 'xcoff', 'unaligned', 'archive'] diff --git a/crates/as-if-std/Cargo.toml b/crates/as-if-std/Cargo.toml index 28af5708..bf374fa6 100644 --- a/crates/as-if-std/Cargo.toml +++ b/crates/as-if-std/Cargo.toml @@ -22,7 +22,7 @@ ruzstd = { version = "0.8.1", optional = true, default-features = false } addr2line = { version = "0.25.0", optional = true, default-features = false } [target.'cfg(not(all(windows, target_env = "msvc", not(target_vendor = "uwp"))))'.dependencies.object] -version = "0.39.0" +version = "0.40.0" default-features = false optional = true features = ['read_core', 'elf', 'macho', 'pe', 'xcoff', 'unaligned', 'archive'] diff --git a/src/print/fuchsia.rs b/src/print/fuchsia.rs index 15e3626d..664bef4a 100644 --- a/src/print/fuchsia.rs +++ b/src/print/fuchsia.rs @@ -200,7 +200,7 @@ impl<'a> Iterator for NoteIter<'a> { Some(Note { name: name, desc: desc, - tipe: nhdr.n_type.get(NE), + tipe: nhdr.n_type.get(NE).0, }) } } diff --git a/src/symbolize/gimli/coff.rs b/src/symbolize/gimli/coff.rs index 6e8ada47..dcb1d027 100644 --- a/src/symbolize/gimli/coff.rs +++ b/src/symbolize/gimli/coff.rs @@ -6,7 +6,7 @@ use core::convert::TryFrom; use object::LittleEndian as LE; use object::pe::{ImageDosHeader, ImageSymbol}; use object::read::StringTable; -use object::read::coff::ImageSymbol as _; +use object::read::coff::Symbol as _; use object::read::pe::{ImageNtHeaders, ImageOptionalHeader, SectionTable}; #[cfg(target_pointer_width = "32")] diff --git a/src/symbolize/gimli/elf.rs b/src/symbolize/gimli/elf.rs index 11fbda7a..53ff0bb4 100644 --- a/src/symbolize/gimli/elf.rs +++ b/src/symbolize/gimli/elf.rs @@ -219,8 +219,7 @@ impl<'a> Object<'a> { // Check for DWARF-standard (gABI) compression, i.e., as generated // by ld's `--compress-debug-sections=zlib-gabi` and // `--compress-debug-sections=zstd` flags. - let flags: u64 = section.sh_flags(self.endian).into(); - if (flags & u64::from(SHF_COMPRESSED)) == 0 { + if !section.sh_flags(self.endian).contains(SHF_COMPRESSED) { // Not compressed. return Some(data.0); } diff --git a/src/symbolize/gimli/macho.rs b/src/symbolize/gimli/macho.rs index 7112694d..4258aee5 100644 --- a/src/symbolize/gimli/macho.rs +++ b/src/symbolize/gimli/macho.rs @@ -163,7 +163,7 @@ fn find_header(data: &'_ [u8]) -> Option<(&'_ Mach, &'_ [u8])> { pub struct Object<'a> { endian: NativeEndian, data: &'a [u8], - dwarf: Option<&'a [MachSection]>, + dwarf: Option<(&'a MachSegment, &'a [MachSection])>, syms: Vec<(&'a [u8], u64)>, syms_sort_by_name: bool, // Only set for executables/libraries, and not the source object files. @@ -185,7 +185,10 @@ impl<'a> Object<'a> { if let Some((segment, section_data)) = MachSegment::from_command(command).ok()? { // Object files should have all sections in a single unnamed segment load command. if segment.name() == b"__DWARF" || (is_object && segment.name() == b"") { - dwarf = segment.sections(endian, section_data).ok(); + dwarf = segment + .sections(endian, section_data) + .ok() + .map(|sections| (segment, sections)); } } else if let Some(symtab) = command.symtab().ok()? { let symbols = symtab.symbols::(endian, data).ok()?; @@ -228,16 +231,19 @@ impl<'a> Object<'a> { pub fn section(&self, _: &Stash, name: &str) -> Option<&'a [u8]> { let name = name.as_bytes(); - let dwarf = self.dwarf?; - let section = dwarf.into_iter().find(|section| { - let section_name = section.name(); - section_name == name || { - section_name.starts_with(b"__") - && name.starts_with(b".") - && §ion_name[2..] == &name[1..] - } - })?; - Some(section.data(self.endian, self.data).ok()?) + let (segment, sections) = self.dwarf?; + let (section, offset) = segment + .section_offsets(self.endian, sections) + .filter_map(|section| section.ok()) + .find(|(section, _offset)| { + let section_name = section.name(); + section_name == name || { + section_name.starts_with(b"__") + && name.starts_with(b".") + && §ion_name[2..] == &name[1..] + } + })?; + Some(section.data(self.endian, self.data, offset).ok()?) } pub fn search_symtab<'b>(&'b self, addr: u64) -> Option<&'b [u8]> { diff --git a/src/symbolize/gimli/xcoff.rs b/src/symbolize/gimli/xcoff.rs index 3b511d7d..9fc14aba 100644 --- a/src/symbolize/gimli/xcoff.rs +++ b/src/symbolize/gimli/xcoff.rs @@ -103,10 +103,8 @@ impl<'a> Object<'a> { fn get_concrete_size(file: &XcoffFile<'a, Xcoff>, sym: &XcoffSymbol<'a, '_, Xcoff>) -> u64 { match sym.flags() { SymbolFlags::Xcoff { - n_sclass: _, - x_smtyp: _, - x_smclas: _, containing_csect: Some(index), + .. } => { if let Ok(tgt_sym) = file.symbol_by_index(index) { Self::get_concrete_size(file, &tgt_sym)