use struct initialization syntax

This commit is contained in:
Folkert 2022-08-26 22:13:55 +02:00
parent 6e19ca1da6
commit 476521e7b7
No known key found for this signature in database
GPG key ID: 1F17F6FFD112B97C

View file

@ -2675,31 +2675,33 @@ pub fn surgery_elf(
let new_text_section_vaddr = new_rodata_section_vaddr as u64 + new_rodata_section_size as u64; let new_text_section_vaddr = new_rodata_section_vaddr as u64 + new_rodata_section_size as u64;
let new_text_section_size = new_sh_offset as u64 - new_text_section_offset as u64; let new_text_section_size = new_sh_offset as u64 - new_text_section_offset as u64;
let new_rodata_section = &mut section_headers[section_headers.len() - 2]; let new_rodata_section_index = section_headers.len() - 2;
new_rodata_section.sh_name = endian::U32::new(LittleEndian, 0); section_headers[new_rodata_section_index] = elf::SectionHeader64 {
new_rodata_section.sh_type = endian::U32::new(LittleEndian, elf::SHT_PROGBITS); sh_name: endian::U32::new(LittleEndian, 0),
new_rodata_section.sh_flags = endian::U64::new(LittleEndian, (elf::SHF_ALLOC) as u64); sh_type: endian::U32::new(LittleEndian, elf::SHT_PROGBITS),
new_rodata_section.sh_addr = endian::U64::new(LittleEndian, new_rodata_section_vaddr as u64); sh_flags: endian::U64::new(LittleEndian, (elf::SHF_ALLOC) as u64),
new_rodata_section.sh_offset = endian::U64::new(LittleEndian, new_rodata_section_offset as u64); sh_addr: endian::U64::new(LittleEndian, new_rodata_section_vaddr as u64),
new_rodata_section.sh_size = endian::U64::new(LittleEndian, new_rodata_section_size); sh_offset: endian::U64::new(LittleEndian, new_rodata_section_offset as u64),
new_rodata_section.sh_link = endian::U32::new(LittleEndian, 0); sh_size: endian::U64::new(LittleEndian, new_rodata_section_size),
new_rodata_section.sh_info = endian::U32::new(LittleEndian, 0); sh_link: endian::U32::new(LittleEndian, 0),
new_rodata_section.sh_addralign = endian::U64::new(LittleEndian, 16); sh_info: endian::U32::new(LittleEndian, 0),
new_rodata_section.sh_entsize = endian::U64::new(LittleEndian, 0); sh_addralign: endian::U64::new(LittleEndian, 16),
sh_entsize: endian::U64::new(LittleEndian, 0),
};
let new_text_section_index = section_headers.len() - 1; let new_text_section_index = section_headers.len() - 1;
let new_text_section = &mut section_headers[new_text_section_index]; section_headers[new_text_section_index] = elf::SectionHeader64 {
new_text_section.sh_name = endian::U32::new(LittleEndian, 0); sh_name: endian::U32::new(LittleEndian, 0),
new_text_section.sh_type = endian::U32::new(LittleEndian, elf::SHT_PROGBITS); sh_type: endian::U32::new(LittleEndian, elf::SHT_PROGBITS),
new_text_section.sh_flags = sh_flags: endian::U64::new(LittleEndian, (elf::SHF_ALLOC | elf::SHF_EXECINSTR) as u64),
endian::U64::new(LittleEndian, (elf::SHF_ALLOC | elf::SHF_EXECINSTR) as u64); sh_addr: endian::U64::new(LittleEndian, new_text_section_vaddr),
new_text_section.sh_addr = endian::U64::new(LittleEndian, new_text_section_vaddr); sh_offset: endian::U64::new(LittleEndian, new_text_section_offset as u64),
new_text_section.sh_offset = endian::U64::new(LittleEndian, new_text_section_offset as u64); sh_size: endian::U64::new(LittleEndian, new_text_section_size),
new_text_section.sh_size = endian::U64::new(LittleEndian, new_text_section_size); sh_link: endian::U32::new(LittleEndian, 0),
new_text_section.sh_link = endian::U32::new(LittleEndian, 0); sh_info: endian::U32::new(LittleEndian, 0),
new_text_section.sh_info = endian::U32::new(LittleEndian, 0); sh_addralign: endian::U64::new(LittleEndian, 16),
new_text_section.sh_addralign = endian::U64::new(LittleEndian, 16); sh_entsize: endian::U64::new(LittleEndian, 0),
new_text_section.sh_entsize = endian::U64::new(LittleEndian, 0); };
// Reload and update file header and size. // Reload and update file header and size.
let file_header = load_struct_inplace_mut::<elf::FileHeader64<LittleEndian>>(exec_mmap, 0); let file_header = load_struct_inplace_mut::<elf::FileHeader64<LittleEndian>>(exec_mmap, 0);
@ -2712,25 +2714,30 @@ pub fn surgery_elf(
ph_offset as usize, ph_offset as usize,
ph_num as usize, ph_num as usize,
); );
let new_rodata_segment = &mut program_headers[program_headers.len() - 2];
new_rodata_segment.p_type = endian::U32::new(LittleEndian, elf::PT_LOAD);
new_rodata_segment.p_flags = endian::U32::new(LittleEndian, elf::PF_R);
new_rodata_segment.p_offset = endian::U64::new(LittleEndian, new_rodata_section_offset as u64);
new_rodata_segment.p_vaddr = endian::U64::new(LittleEndian, new_rodata_section_vaddr as u64);
new_rodata_segment.p_paddr = endian::U64::new(LittleEndian, new_rodata_section_vaddr as u64);
new_rodata_segment.p_filesz = endian::U64::new(LittleEndian, new_rodata_section_size);
new_rodata_segment.p_memsz = endian::U64::new(LittleEndian, new_rodata_section_virtual_size);
new_rodata_segment.p_align = endian::U64::new(LittleEndian, md.load_align_constraint);
let new_text_segment = &mut program_headers[program_headers.len() - 1]; let new_rodata_segment_index = program_headers.len() - 2;
new_text_segment.p_type = endian::U32::new(LittleEndian, elf::PT_LOAD); program_headers[new_rodata_segment_index] = elf::ProgramHeader64 {
new_text_segment.p_flags = endian::U32::new(LittleEndian, elf::PF_R | elf::PF_X); p_type: endian::U32::new(LittleEndian, elf::PT_LOAD),
new_text_segment.p_offset = endian::U64::new(LittleEndian, new_text_section_offset as u64); p_flags: endian::U32::new(LittleEndian, elf::PF_R),
new_text_segment.p_vaddr = endian::U64::new(LittleEndian, new_text_section_vaddr); p_offset: endian::U64::new(LittleEndian, new_rodata_section_offset as u64),
new_text_segment.p_paddr = endian::U64::new(LittleEndian, new_text_section_vaddr); p_vaddr: endian::U64::new(LittleEndian, new_rodata_section_vaddr as u64),
new_text_segment.p_filesz = endian::U64::new(LittleEndian, new_text_section_size); p_paddr: endian::U64::new(LittleEndian, new_rodata_section_vaddr as u64),
new_text_segment.p_memsz = endian::U64::new(LittleEndian, new_text_section_size); p_filesz: endian::U64::new(LittleEndian, new_rodata_section_size),
new_text_segment.p_align = endian::U64::new(LittleEndian, md.load_align_constraint); p_memsz: endian::U64::new(LittleEndian, new_rodata_section_virtual_size),
p_align: endian::U64::new(LittleEndian, md.load_align_constraint),
};
let new_text_segment_index = program_headers.len() - 1;
program_headers[new_text_segment_index] = elf::ProgramHeader64 {
p_type: endian::U32::new(LittleEndian, elf::PT_LOAD),
p_flags: endian::U32::new(LittleEndian, elf::PF_R | elf::PF_X),
p_offset: endian::U64::new(LittleEndian, new_text_section_offset as u64),
p_vaddr: endian::U64::new(LittleEndian, new_text_section_vaddr),
p_paddr: endian::U64::new(LittleEndian, new_text_section_vaddr),
p_filesz: endian::U64::new(LittleEndian, new_text_section_size),
p_memsz: endian::U64::new(LittleEndian, new_text_section_size),
p_align: endian::U64::new(LittleEndian, md.load_align_constraint),
};
// Update calls from platform and dynamic symbols. // Update calls from platform and dynamic symbols.
let dynsym_offset = md.dynamic_symbol_table_section_offset + md.added_byte_count; let dynsym_offset = md.dynamic_symbol_table_section_offset + md.added_byte_count;