mirror of
https://github.com/encounter/objdiff.git
synced 2026-07-10 12:18:36 -07:00
Bump Object Crate to 0.39.1 (#348)
* Bump Object Crate to 0.39.0 * Bump Object Crate to 0.39.1
This commit is contained in:
Generated
+2
-2
@@ -3621,9 +3621,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "object"
|
name = "object"
|
||||||
version = "0.37.3"
|
version = "0.39.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe"
|
checksum = "2e5a6c098c7a3b6547378093f5cc30bc54fd361ce711e05293a5cc589562739b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"memchr",
|
"memchr",
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ itertools = { version = "0.14", default-features = false, features = ["use_alloc
|
|||||||
log = { version = "0.4", default-features = false, optional = true }
|
log = { version = "0.4", default-features = false, optional = true }
|
||||||
memmap2 = { version = "0.9", optional = true }
|
memmap2 = { version = "0.9", optional = true }
|
||||||
num-traits = { version = "0.2", default-features = false, optional = true }
|
num-traits = { version = "0.2", default-features = false, optional = true }
|
||||||
object = { version = "0.37", default-features = false, features = ["read_core", "elf", "coff"] }
|
object = { version = "0.39.1", default-features = false, features = ["read_core", "elf", "coff"] }
|
||||||
pbjson = { version = "0.8", default-features = false, optional = true }
|
pbjson = { version = "0.8", default-features = false, optional = true }
|
||||||
prost = { version = "0.14", default-features = false, features = ["derive"], optional = true }
|
prost = { version = "0.14", default-features = false, features = ["derive"], optional = true }
|
||||||
regex = { version = "1.12", default-features = false, features = [], optional = true }
|
regex = { version = "1.12", default-features = false, features = [], optional = true }
|
||||||
|
|||||||
@@ -352,7 +352,7 @@ impl Arch for ArchArm {
|
|||||||
| elf::R_ARM_CALL
|
| elf::R_ARM_CALL
|
||||||
| elf::R_ARM_JUMP24 => {
|
| elf::R_ARM_JUMP24 => {
|
||||||
let data = section_data[address..address + 4].try_into()?;
|
let data = section_data[address..address + 4].try_into()?;
|
||||||
let addend = self.endianness.read_i32_bytes(data);
|
let addend = self.endianness.read_i32(data);
|
||||||
let imm24 = addend & 0xffffff;
|
let imm24 = addend & 0xffffff;
|
||||||
(imm24 << 2) << 8 >> 8
|
(imm24 << 2) << 8 >> 8
|
||||||
}
|
}
|
||||||
@@ -360,9 +360,9 @@ impl Arch for ArchArm {
|
|||||||
// Thumb calls
|
// Thumb calls
|
||||||
elf::R_ARM_THM_PC22 | elf::R_ARM_THM_XPC22 => {
|
elf::R_ARM_THM_PC22 | elf::R_ARM_THM_XPC22 => {
|
||||||
let data = section_data[address..address + 2].try_into()?;
|
let data = section_data[address..address + 2].try_into()?;
|
||||||
let high = self.endianness.read_i16_bytes(data) as i32;
|
let high = self.endianness.read_i16(data) as i32;
|
||||||
let data = section_data[address + 2..address + 4].try_into()?;
|
let data = section_data[address + 2..address + 4].try_into()?;
|
||||||
let low = self.endianness.read_i16_bytes(data) as i32;
|
let low = self.endianness.read_i16(data) as i32;
|
||||||
|
|
||||||
let imm22 = ((high & 0x7ff) << 11) | (low & 0x7ff);
|
let imm22 = ((high & 0x7ff) << 11) | (low & 0x7ff);
|
||||||
(imm22 << 1) << 9 >> 9
|
(imm22 << 1) << 9 >> 9
|
||||||
@@ -371,7 +371,7 @@ impl Arch for ArchArm {
|
|||||||
// Thumb unconditional branch (B, 11-bit offset)
|
// Thumb unconditional branch (B, 11-bit offset)
|
||||||
elf::R_ARM_THM_PC11 => {
|
elf::R_ARM_THM_PC11 => {
|
||||||
let data = section_data[address..address + 2].try_into()?;
|
let data = section_data[address..address + 2].try_into()?;
|
||||||
let insn = self.endianness.read_u16_bytes(data) as i32;
|
let insn = self.endianness.read_u16(data) as i32;
|
||||||
let imm11 = insn & 0x7ff;
|
let imm11 = insn & 0x7ff;
|
||||||
(imm11 << 1) << 20 >> 20
|
(imm11 << 1) << 20 >> 20
|
||||||
}
|
}
|
||||||
@@ -379,7 +379,7 @@ impl Arch for ArchArm {
|
|||||||
// Thumb conditional branch (B<cond>, 8-bit offset)
|
// Thumb conditional branch (B<cond>, 8-bit offset)
|
||||||
elf::R_ARM_THM_PC9 => {
|
elf::R_ARM_THM_PC9 => {
|
||||||
let data = section_data[address..address + 2].try_into()?;
|
let data = section_data[address..address + 2].try_into()?;
|
||||||
let insn = self.endianness.read_u16_bytes(data) as i32;
|
let insn = self.endianness.read_u16(data) as i32;
|
||||||
let imm8 = insn & 0xff;
|
let imm8 = insn & 0xff;
|
||||||
(imm8 << 1) << 23 >> 23
|
(imm8 << 1) << 23 >> 23
|
||||||
}
|
}
|
||||||
@@ -387,7 +387,7 @@ impl Arch for ArchArm {
|
|||||||
// Data
|
// Data
|
||||||
elf::R_ARM_ABS32 => {
|
elf::R_ARM_ABS32 => {
|
||||||
let data = section_data[address..address + 4].try_into()?;
|
let data = section_data[address..address + 4].try_into()?;
|
||||||
self.endianness.read_i32_bytes(data)
|
self.endianness.read_i32(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
flags => bail!("Unsupported ARM implicit relocation {flags:?}"),
|
flags => bail!("Unsupported ARM implicit relocation {flags:?}"),
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ impl ArchMips {
|
|||||||
.and_then(|section| section.data().ok())
|
.and_then(|section| section.data().ok())
|
||||||
.and_then(|data| data.get(0x14..0x18))
|
.and_then(|data| data.get(0x14..0x18))
|
||||||
.and_then(|s| s.try_into().ok())
|
.and_then(|s| s.try_into().ok())
|
||||||
.map(|bytes| endianness.read_i32_bytes(bytes))
|
.map(|bytes| endianness.read_i32(bytes))
|
||||||
.unwrap_or(0);
|
.unwrap_or(0);
|
||||||
|
|
||||||
// Parse all relocations to pair R_MIPS_HI16 and R_MIPS_LO16. Since the instructions only
|
// Parse all relocations to pair R_MIPS_HI16 and R_MIPS_LO16. Since the instructions only
|
||||||
@@ -98,13 +98,13 @@ impl ArchMips {
|
|||||||
match reloc.flags() {
|
match reloc.flags() {
|
||||||
object::RelocationFlags::Elf { r_type: elf::R_MIPS_HI16 } => {
|
object::RelocationFlags::Elf { r_type: elf::R_MIPS_HI16 } => {
|
||||||
let code = data[addr as usize..addr as usize + 4].try_into()?;
|
let code = data[addr as usize..addr as usize + 4].try_into()?;
|
||||||
let addend = ((endianness.read_u32_bytes(code) & 0x0000FFFF) << 16) as i32;
|
let addend = ((endianness.read_u32(code) & 0x0000FFFF) << 16) as i32;
|
||||||
last_hi = Some(addr);
|
last_hi = Some(addr);
|
||||||
last_hi_addend = addend;
|
last_hi_addend = addend;
|
||||||
}
|
}
|
||||||
object::RelocationFlags::Elf { r_type: elf::R_MIPS_LO16 } => {
|
object::RelocationFlags::Elf { r_type: elf::R_MIPS_LO16 } => {
|
||||||
let code = data[addr as usize..addr as usize + 4].try_into()?;
|
let code = data[addr as usize..addr as usize + 4].try_into()?;
|
||||||
let addend = (endianness.read_u32_bytes(code) & 0x0000FFFF) as i16 as i32;
|
let addend = (endianness.read_u32(code) & 0x0000FFFF) as i16 as i32;
|
||||||
let full_addend = (last_hi_addend + addend) as i64;
|
let full_addend = (last_hi_addend + addend) as i64;
|
||||||
if let Some(hi_addr) = last_hi.take() {
|
if let Some(hi_addr) = last_hi.take() {
|
||||||
addends.insert(hi_addr, full_addend);
|
addends.insert(hi_addr, full_addend);
|
||||||
@@ -197,7 +197,7 @@ impl ArchMips {
|
|||||||
diff_config: &DiffObjConfig,
|
diff_config: &DiffObjConfig,
|
||||||
) -> Result<rabbitizer::Instruction> {
|
) -> Result<rabbitizer::Instruction> {
|
||||||
Ok(rabbitizer::Instruction::new(
|
Ok(rabbitizer::Instruction::new(
|
||||||
self.endianness.read_u32_bytes(code.try_into()?),
|
self.endianness.read_u32(code.try_into()?),
|
||||||
Vram::new(ins_ref.address as u32),
|
Vram::new(ins_ref.address as u32),
|
||||||
self.instruction_flags(diff_config),
|
self.instruction_flags(diff_config),
|
||||||
))
|
))
|
||||||
@@ -217,7 +217,7 @@ impl Arch for ArchMips {
|
|||||||
let mut ops = Vec::<InstructionRef>::with_capacity(code.len() / 4);
|
let mut ops = Vec::<InstructionRef>::with_capacity(code.len() / 4);
|
||||||
let mut cur_addr = address as u32;
|
let mut cur_addr = address as u32;
|
||||||
for chunk in code.chunks_exact(4) {
|
for chunk in code.chunks_exact(4) {
|
||||||
let code = self.endianness.read_u32_bytes(chunk.try_into()?);
|
let code = self.endianness.read_u32(chunk.try_into()?);
|
||||||
let instruction =
|
let instruction =
|
||||||
rabbitizer::Instruction::new(code, Vram::new(cur_addr), instruction_flags);
|
rabbitizer::Instruction::new(code, Vram::new(cur_addr), instruction_flags);
|
||||||
let opcode = instruction.opcode() as u16;
|
let opcode = instruction.opcode() as u16;
|
||||||
@@ -269,7 +269,7 @@ impl Arch for ArchMips {
|
|||||||
let data = section.data()?;
|
let data = section.data()?;
|
||||||
let code = self
|
let code = self
|
||||||
.endianness
|
.endianness
|
||||||
.read_u32_bytes(data[address as usize..address as usize + 4].try_into()?);
|
.read_u32(data[address as usize..address as usize + 4].try_into()?);
|
||||||
let addend = match r_type {
|
let addend = match r_type {
|
||||||
elf::R_MIPS_32 => code as i64,
|
elf::R_MIPS_32 => code as i64,
|
||||||
elf::R_MIPS_26 => ((code & 0x03FFFFFF) << 2) as i64,
|
elf::R_MIPS_26 => ((code & 0x03FFFFFF) << 2) as i64,
|
||||||
@@ -366,7 +366,7 @@ impl Arch for ArchMips {
|
|||||||
&& new_address >= symbol.address + 4
|
&& new_address >= symbol.address + 4
|
||||||
&& let Some(data) = section.data_range(new_address - 4, 4)
|
&& let Some(data) = section.data_range(new_address - 4, 4)
|
||||||
&& let instruction = rabbitizer::Instruction::new(
|
&& let instruction = rabbitizer::Instruction::new(
|
||||||
self.endianness.read_u32_bytes(data.try_into().unwrap()),
|
self.endianness.read_u32(data.try_into().unwrap()),
|
||||||
Vram::new((new_address - 4) as u32),
|
Vram::new((new_address - 4) as u32),
|
||||||
self.default_instruction_flags(),
|
self.default_instruction_flags(),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ impl DataType {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
DataType::Int16 => {
|
DataType::Int16 => {
|
||||||
let i = endian.read_i16_bytes(bytes.try_into().unwrap());
|
let i = endian.read_i16(bytes.try_into().unwrap());
|
||||||
strs.push(LiteralInfo { literal: format!("{i:#x}"), ..Default::default() });
|
strs.push(LiteralInfo { literal: format!("{i:#x}"), ..Default::default() });
|
||||||
|
|
||||||
if i < 0 {
|
if i < 0 {
|
||||||
@@ -162,7 +162,7 @@ impl DataType {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
DataType::Int32 => {
|
DataType::Int32 => {
|
||||||
let i = endian.read_i32_bytes(bytes.try_into().unwrap());
|
let i = endian.read_i32(bytes.try_into().unwrap());
|
||||||
strs.push(LiteralInfo { literal: format!("{i:#x}"), ..Default::default() });
|
strs.push(LiteralInfo { literal: format!("{i:#x}"), ..Default::default() });
|
||||||
|
|
||||||
if i < 0 {
|
if i < 0 {
|
||||||
@@ -173,7 +173,7 @@ impl DataType {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
DataType::Int64 => {
|
DataType::Int64 => {
|
||||||
let i = endian.read_i64_bytes(bytes.try_into().unwrap());
|
let i = endian.read_i64(bytes.try_into().unwrap());
|
||||||
strs.push(LiteralInfo { literal: format!("{i:#x}"), ..Default::default() });
|
strs.push(LiteralInfo { literal: format!("{i:#x}"), ..Default::default() });
|
||||||
|
|
||||||
if i < 0 {
|
if i < 0 {
|
||||||
|
|||||||
@@ -199,8 +199,8 @@ impl Arch for ArchX86 {
|
|||||||
if resolved.ins_ref.opcode == OPCODE_DATA {
|
if resolved.ins_ref.opcode == OPCODE_DATA {
|
||||||
let (mnemonic, imm) = match resolved.ins_ref.size {
|
let (mnemonic, imm) = match resolved.ins_ref.size {
|
||||||
1 => (".byte", resolved.code[0] as u64),
|
1 => (".byte", resolved.code[0] as u64),
|
||||||
2 => (".word", self.endianness.read_u16_bytes(resolved.code.try_into()?) as u64),
|
2 => (".word", self.endianness.read_u16(resolved.code.try_into()?) as u64),
|
||||||
4 => (".dword", self.endianness.read_u32_bytes(resolved.code.try_into()?) as u64),
|
4 => (".dword", self.endianness.read_u32(resolved.code.try_into()?) as u64),
|
||||||
_ => bail!("Unsupported x86 inline data size {}", resolved.ins_ref.size),
|
_ => bail!("Unsupported x86 inline data size {}", resolved.ins_ref.size),
|
||||||
};
|
};
|
||||||
cb(InstructionPart::opcode(mnemonic, OPCODE_DATA))?;
|
cb(InstructionPart::opcode(mnemonic, OPCODE_DATA))?;
|
||||||
@@ -294,7 +294,7 @@ impl Arch for ArchX86 {
|
|||||||
} => {
|
} => {
|
||||||
let data =
|
let data =
|
||||||
section.data()?[address as usize..address as usize + 4].try_into()?;
|
section.data()?[address as usize..address as usize + 4].try_into()?;
|
||||||
self.endianness.read_i32_bytes(data) as i64
|
self.endianness.read_i32(data) as i64
|
||||||
}
|
}
|
||||||
flags => bail!("Unsupported x86 implicit relocation {flags:?}"),
|
flags => bail!("Unsupported x86 implicit relocation {flags:?}"),
|
||||||
},
|
},
|
||||||
@@ -305,13 +305,13 @@ impl Arch for ArchX86 {
|
|||||||
| object::RelocationFlags::Elf { r_type: elf::R_X86_64_32 | elf::R_X86_64_PC32 } => {
|
| object::RelocationFlags::Elf { r_type: elf::R_X86_64_32 | elf::R_X86_64_PC32 } => {
|
||||||
let data =
|
let data =
|
||||||
section.data()?[address as usize..address as usize + 4].try_into()?;
|
section.data()?[address as usize..address as usize + 4].try_into()?;
|
||||||
self.endianness.read_i32_bytes(data) as i64
|
self.endianness.read_i32(data) as i64
|
||||||
}
|
}
|
||||||
object::RelocationFlags::Coff { typ: pe::IMAGE_REL_AMD64_ADDR64 }
|
object::RelocationFlags::Coff { typ: pe::IMAGE_REL_AMD64_ADDR64 }
|
||||||
| object::RelocationFlags::Elf { r_type: elf::R_X86_64_64 } => {
|
| object::RelocationFlags::Elf { r_type: elf::R_X86_64_64 } => {
|
||||||
let data =
|
let data =
|
||||||
section.data()?[address as usize..address as usize + 8].try_into()?;
|
section.data()?[address as usize..address as usize + 8].try_into()?;
|
||||||
self.endianness.read_i64_bytes(data)
|
self.endianness.read_i64(data)
|
||||||
}
|
}
|
||||||
flags => bail!("Unsupported x86-64 implicit relocation {flags:?}"),
|
flags => bail!("Unsupported x86-64 implicit relocation {flags:?}"),
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ impl SplitMeta {
|
|||||||
result.module_name = Some(string);
|
result.module_name = Some(string);
|
||||||
}
|
}
|
||||||
NT_SPLIT_MODULE_ID => {
|
NT_SPLIT_MODULE_ID => {
|
||||||
result.module_id = Some(e.read_u32_bytes(
|
result.module_id = Some(e.read_u32(
|
||||||
note.desc.try_into().map_err(|_| anyhow!("Invalid module ID size"))?,
|
note.desc.try_into().map_err(|_| anyhow!("Invalid module ID size"))?,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
@@ -61,14 +61,13 @@ impl SplitMeta {
|
|||||||
let vec = if is_64 {
|
let vec = if is_64 {
|
||||||
let mut vec = vec![0u64; note.desc.len() / 8];
|
let mut vec = vec![0u64; note.desc.len() / 8];
|
||||||
for (i, v) in vec.iter_mut().enumerate() {
|
for (i, v) in vec.iter_mut().enumerate() {
|
||||||
*v =
|
*v = e.read_u64(note.desc[i * 8..(i + 1) * 8].try_into().unwrap());
|
||||||
e.read_u64_bytes(note.desc[i * 8..(i + 1) * 8].try_into().unwrap());
|
|
||||||
}
|
}
|
||||||
vec
|
vec
|
||||||
} else {
|
} else {
|
||||||
let mut vec = vec![0u64; note.desc.len() / 4];
|
let mut vec = vec![0u64; note.desc.len() / 4];
|
||||||
for (i, v) in vec.iter_mut().enumerate() {
|
for (i, v) in vec.iter_mut().enumerate() {
|
||||||
*v = e.read_u32_bytes(note.desc[i * 4..(i + 1) * 4].try_into().unwrap())
|
*v = e.read_u32(note.desc[i * 4..(i + 1) * 4].try_into().unwrap())
|
||||||
as u64;
|
as u64;
|
||||||
}
|
}
|
||||||
vec
|
vec
|
||||||
@@ -101,7 +100,7 @@ impl SplitMeta {
|
|||||||
}
|
}
|
||||||
if let Some(module_id) = self.module_id {
|
if let Some(module_id) = self.module_id {
|
||||||
write_note_header(writer, e, NT_SPLIT_MODULE_ID, 4)?;
|
write_note_header(writer, e, NT_SPLIT_MODULE_ID, 4)?;
|
||||||
writer.write_all(&e.write_u32_bytes(module_id))?;
|
writer.write_all(&e.write_u32(module_id))?;
|
||||||
}
|
}
|
||||||
if let Some(virtual_addresses) = &self.virtual_addresses {
|
if let Some(virtual_addresses) = &self.virtual_addresses {
|
||||||
let count = virtual_addresses.len();
|
let count = virtual_addresses.len();
|
||||||
@@ -109,11 +108,11 @@ impl SplitMeta {
|
|||||||
write_note_header(writer, e, NT_SPLIT_VIRTUAL_ADDRESSES, size)?;
|
write_note_header(writer, e, NT_SPLIT_VIRTUAL_ADDRESSES, size)?;
|
||||||
if is_64 {
|
if is_64 {
|
||||||
for &addr in virtual_addresses {
|
for &addr in virtual_addresses {
|
||||||
writer.write_all(&e.write_u64_bytes(addr))?;
|
writer.write_all(&e.write_u64(addr))?;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for &addr in virtual_addresses {
|
for &addr in virtual_addresses {
|
||||||
writer.write_all(&e.write_u32_bytes(addr as u32))?;
|
writer.write_all(&e.write_u32(addr as u32))?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -208,9 +207,9 @@ where
|
|||||||
E: Endian,
|
E: Endian,
|
||||||
W: std::io::Write + ?Sized,
|
W: std::io::Write + ?Sized,
|
||||||
{
|
{
|
||||||
writer.write_all(&e.write_u32_bytes(ELF_NOTE_SPLIT.len() as u32 + 1))?; // Name Size
|
writer.write_all(&e.write_u32(ELF_NOTE_SPLIT.len() as u32 + 1))?; // Name Size
|
||||||
writer.write_all(&e.write_u32_bytes(desc_len as u32))?; // Desc Size
|
writer.write_all(&e.write_u32(desc_len as u32))?; // Desc Size
|
||||||
writer.write_all(&e.write_u32_bytes(kind))?; // Type
|
writer.write_all(&e.write_u32(kind))?; // Type
|
||||||
writer.write_all(ELF_NOTE_SPLIT)?; // Name
|
writer.write_all(ELF_NOTE_SPLIT)?; // Name
|
||||||
writer.write_all(&[0; 1])?; // Null terminator
|
writer.write_all(&[0; 1])?; // Null terminator
|
||||||
align_data_to_4(writer, ELF_NOTE_SPLIT.len() + 1)?;
|
align_data_to_4(writer, ELF_NOTE_SPLIT.len() + 1)?;
|
||||||
|
|||||||
@@ -28,14 +28,14 @@ impl<N: PrimInt> fmt::UpperHex for ReallySigned<N> {
|
|||||||
|
|
||||||
pub fn read_u32(obj_file: &object::File, reader: &mut &[u8]) -> Result<u32> {
|
pub fn read_u32(obj_file: &object::File, reader: &mut &[u8]) -> Result<u32> {
|
||||||
ensure!(reader.len() >= 4, "Not enough bytes to read u32");
|
ensure!(reader.len() >= 4, "Not enough bytes to read u32");
|
||||||
let value = u32::from_ne_bytes(reader[..4].try_into()?);
|
let value = reader[..4].try_into()?;
|
||||||
*reader = &reader[4..];
|
*reader = &reader[4..];
|
||||||
Ok(obj_file.endianness().read_u32(value))
|
Ok(obj_file.endianness().read_u32(value))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn read_u16(obj_file: &object::File, reader: &mut &[u8]) -> Result<u16> {
|
pub fn read_u16(obj_file: &object::File, reader: &mut &[u8]) -> Result<u16> {
|
||||||
ensure!(reader.len() >= 2, "Not enough bytes to read u16");
|
ensure!(reader.len() >= 2, "Not enough bytes to read u16");
|
||||||
let value = u16::from_ne_bytes(reader[..2].try_into()?);
|
let value = reader[..2].try_into()?;
|
||||||
*reader = &reader[2..];
|
*reader = &reader[2..];
|
||||||
Ok(obj_file.endianness().read_u16(value))
|
Ok(obj_file.endianness().read_u16(value))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user