PE import start (fixed header size -> sections work)

This commit is contained in:
2026-06-08 17:31:01 -04:00
parent c9add923be
commit c17122679e
9 changed files with 264 additions and 139 deletions
+27 -21
View File
@@ -1,6 +1,7 @@
use crate::backend::{Addr, LinkedProgram, container::as_u8_slice};
use crate::backend::{LinkedProgram, container::encode::ByteEncoder};
#[repr(C)]
#[derive(Default)]
pub struct ELF64Header {
magic: u32,
class: u8,
@@ -25,6 +26,7 @@ pub struct ELF64Header {
}
#[repr(C)]
#[derive(Default)]
pub struct ProgramHeader {
ty: u32,
flags: u32,
@@ -80,19 +82,17 @@ pub fn create(program: &[u8], start_offset: u64) -> Vec<u8> {
let page_size = 0x1000;
// I don't know if I have to add addr_start here, idk how it maps the memory
let program_size = std::mem::size_of_val(program) as u64;
let program_header = ProgramHeader {
ty: 0x1, // LOAD
flags: 0b101, // executable, readable
offset: 0x0,
vaddr: addr_start,
paddr: 0x0,
filesz: program_size,
memsz: program_size,
align: page_size,
};
let header_len = (size_of::<ELF64Header>() + size_of::<ProgramHeader>()) as u64;
let program_pos = header_len;
let header = ELF64Header {
let mut data = ByteEncoder::default();
let header = data.reserve::<ELF64Header>();
let program_header_offset = data.pos() as u64;
let program_header = data.reserve::<ProgramHeader>();
let program_pos = data.pos() as u64;
data.extend(program);
data[header] = ELF64Header {
magic: 0x7f_45_4c_46u32.swap_bytes(),
class: 0x2, // 64 bit
endianness: 0x1, // little endian
@@ -103,8 +103,8 @@ pub fn create(program: &[u8], start_offset: u64) -> Vec<u8> {
ty: if pie { EType::Dyn } else { EType::Exec } as u16,
machine: Arch::X86_64.machine(),
e_version: 0x1,
entry: addr_start + program_pos + start_offset as u64,
program_header_offset: size_of::<ELF64Header>() as u64,
entry: addr_start + program_pos + start_offset,
program_header_offset,
section_header_offset: 0x0,
// C ABI (16 bit instruction align) + double precision floats
flags: 0x1 | 0x4,
@@ -115,11 +115,17 @@ pub fn create(program: &[u8], start_offset: u64) -> Vec<u8> {
section_header_num: 0x0,
section_header_str_idx: 0x0,
};
let mut bytes: Vec<u8> = Vec::new();
bytes.extend(as_u8_slice(&header));
bytes.extend(as_u8_slice(&program_header));
bytes.extend(program);
bytes
data[program_header] = ProgramHeader {
ty: 0x1, // LOAD
flags: 0b101, // executable, readable
offset: 0x0,
vaddr: addr_start,
paddr: 0x0,
filesz: program_size,
memsz: program_size,
align: page_size,
};
data.data
}
impl LinkedProgram<u64> {