switch from assignment to using the set method for numbers

This commit is contained in:
Brendan Hansknecht 2023-04-27 07:20:24 -07:00
parent e88d759331
commit dbbc621892
No known key found for this signature in database
GPG key ID: 0EA784685083E75B
2 changed files with 33 additions and 26 deletions

View file

@ -578,17 +578,18 @@ fn gen_elf_le(
let p_offset = ph.p_offset.get(LE);
if (p_type == elf::PT_LOAD && p_offset == 0) || p_type == elf::PT_PHDR {
// Extend length for the first segment and the program header.
ph.p_filesz = endian::U64::new(LE, ph.p_filesz.get(LE) + md.added_byte_count);
ph.p_memsz = endian::U64::new(LE, ph.p_memsz.get(LE) + md.added_byte_count);
ph.p_filesz
.set(LE, ph.p_filesz.get(LE) + md.added_byte_count);
ph.p_memsz.set(LE, ph.p_memsz.get(LE) + md.added_byte_count);
} else {
// Shift if needed.
if physical_shift_start <= p_offset {
ph.p_offset = endian::U64::new(LE, p_offset + md.added_byte_count);
ph.p_offset.set(LE, p_offset + md.added_byte_count);
}
let p_vaddr = ph.p_vaddr.get(LE);
if virtual_shift_start <= p_vaddr {
ph.p_vaddr = endian::U64::new(LE, p_vaddr + md.added_byte_count);
ph.p_paddr = endian::U64::new(LE, p_vaddr + md.added_byte_count);
ph.p_vaddr.set(LE, p_vaddr + md.added_byte_count);
ph.p_paddr.set(LE, p_vaddr + md.added_byte_count);
}
}
}
@ -623,10 +624,10 @@ fn gen_elf_le(
let sh_offset = sh.sh_offset.get(LE);
let sh_addr = sh.sh_addr.get(LE);
if physical_shift_start <= sh_offset {
sh.sh_offset = endian::U64::new(LE, sh_offset + md.added_byte_count);
sh.sh_offset.set(LE, sh_offset + md.added_byte_count);
}
if virtual_shift_start <= sh_addr {
sh.sh_addr = endian::U64::new(LE, sh_addr + md.added_byte_count);
sh.sh_addr.set(LE, sh_addr + md.added_byte_count);
}
// Record every relocation section.
@ -660,7 +661,7 @@ fn gen_elf_le(
for rel in relocations.iter_mut() {
let r_offset = rel.r_offset.get(LE);
if virtual_shift_start <= r_offset {
rel.r_offset = endian::U64::new(LE, r_offset + md.added_byte_count);
rel.r_offset.set(LE, r_offset + md.added_byte_count);
}
}
}
@ -675,7 +676,7 @@ fn gen_elf_le(
for (i, rel) in relocations.iter_mut().enumerate() {
let r_offset = rel.r_offset.get(LE);
if virtual_shift_start <= r_offset {
rel.r_offset = endian::U64::new(LE, r_offset + md.added_byte_count);
rel.r_offset.set(LE, r_offset + md.added_byte_count);
// Deal with potential adjusts to absolute jumps.
// TODO: Verify other relocation types.
if rel.r_type(LE, false) == elf::R_X86_64_RELATIVE {
@ -796,7 +797,7 @@ fn gen_elf_le(
dyn_offset as usize,
dynamic_lib_count,
);
for mut d in dyns {
for d in dyns {
match d.d_tag.get(LE) as u32 {
// I believe this is the list of symbols that need to be update if addresses change.
// I am less sure about the symbols from GNU_HASH down.
@ -830,7 +831,7 @@ fn gen_elf_le(
| elf::DT_VERNEED => {
let d_addr = d.d_val.get(LE);
if virtual_shift_start <= d_addr {
d.d_val = endian::U64::new(LE, d_addr + md.added_byte_count);
d.d_val.set(LE, d_addr + md.added_byte_count);
}
}
_ => {}
@ -850,7 +851,7 @@ fn gen_elf_le(
for sym in symbols {
let addr = sym.st_value.get(LE);
if virtual_shift_start <= addr {
sym.st_value = endian::U64::new(LE, addr + md.added_byte_count);
sym.st_value.set(LE, addr + md.added_byte_count);
}
}
@ -882,13 +883,17 @@ fn gen_elf_le(
}
// Update main elf header for extra data.
let mut file_header = load_struct_inplace_mut::<elf::FileHeader64<LE>>(&mut out_mmap, 0);
file_header.e_shoff = endian::U64::new(LE, file_header.e_shoff.get(LE) + md.added_byte_count);
let file_header = load_struct_inplace_mut::<elf::FileHeader64<LE>>(&mut out_mmap, 0);
file_header
.e_shoff
.set(LE, file_header.e_shoff.get(LE) + md.added_byte_count);
let e_entry = file_header.e_entry.get(LE);
if virtual_shift_start <= e_entry {
file_header.e_entry = endian::U64::new(LE, e_entry + md.added_byte_count);
file_header.e_entry.set(LE, e_entry + md.added_byte_count);
}
file_header.e_phnum = endian::U16::new(LE, ph_num + added_header_count as u16);
file_header
.e_phnum
.set(LE, ph_num + added_header_count as u16);
out_mmap
}
@ -1486,8 +1491,10 @@ fn surgery_elf_help(
// Reload and update file header and size.
let file_header = load_struct_inplace_mut::<elf::FileHeader64<LE>>(exec_mmap, 0);
file_header.e_shoff = endian::U64::new(LE, new_sh_offset as u64);
file_header.e_shnum = endian::U16::new(LE, sh_num + new_section_count as u16);
file_header.e_shoff.set(LE, new_sh_offset as u64);
file_header
.e_shnum
.set(LE, sh_num + new_section_count as u16);
// Add 2 new segments that match the new sections.
let program_headers = load_structs_inplace_mut::<elf::ProgramHeader64<LE>>(
@ -1606,9 +1613,9 @@ fn surgery_elf_help(
exec_mmap,
dynsym_offset as usize + *i as usize * mem::size_of::<elf::Sym64<LE>>(),
);
sym.st_shndx = endian::U16::new(LE, new_text_section_index as u16);
sym.st_value = endian::U64::new(LE, func_virt_offset);
sym.st_size = endian::U64::new(
sym.st_shndx.set(LE, new_text_section_index as u16);
sym.st_value.set(LE, func_virt_offset);
sym.st_size.set(
LE,
match app_func_size_map.get(func_name) {
Some(size) => *size,
@ -1623,9 +1630,9 @@ fn surgery_elf_help(
exec_mmap,
symtab_offset as usize + *i as usize * mem::size_of::<elf::Sym64<LE>>(),
);
sym.st_shndx = endian::U16::new(LE, new_text_section_index as u16);
sym.st_value = endian::U64::new(LE, func_virt_offset);
sym.st_size = endian::U64::new(
sym.st_shndx.set(LE, new_text_section_index as u16);
sym.st_value.set(LE, func_virt_offset);
sym.st_size.set(
LE,
match app_func_size_map.get(func_name) {
Some(size) => *size,

View file

@ -1550,8 +1550,8 @@ fn surgery_macho_help(
// exec_mmap,
// dynsym_offset as usize + *i as usize * mem::size_of::<elf::Sym64<LE >>(),
// );
// sym.st_value = endian::U64::new(LE , func_virt_offset as u64);
// sym.st_size = endian::U64::new(
// sym.st_value.set(LE , func_virt_offset as u64);
// sym.st_size.set(
// LE ,
// match app_func_size_map.get(func_name) {
// Some(size) => *size,