IMPORTS WORKING

This commit is contained in:
2026-06-09 00:08:26 -04:00
parent 6bc502d284
commit e4acaf40aa
11 changed files with 205 additions and 115 deletions
+15 -16
View File
@@ -1,18 +1,9 @@
use crate::backend::pe::data_dir::DataDir;
use crate::backend::{LibImport, pe::data_dir::DataDir};
use super::ByteEncoder;
pub struct LibImport {
pub name: String,
pub syms: Vec<SymImport>,
}
pub struct SymImport {
name: String,
usages: Vec<usize>,
}
pub fn encode(data: &mut ByteEncoder, imports: &[LibImport]) -> DataDir {
pub fn encode(data: &mut ByteEncoder, imports: &[LibImport], code_start: usize) -> DataDir {
data.align(4);
let start = data.pos() as u32;
let idt = data.reserve_arr::<ImportDirTable>(imports.len());
// null entry to mark end
@@ -30,7 +21,6 @@ pub fn encode(data: &mut ByteEncoder, imports: &[LibImport]) -> DataDir {
let lookup_start = data.pos();
let lookup = data.reserve_arr::<ImportLookupEntry>(import.syms.len());
data.pad(size_of::<ImportLookupEntry>());
let lookup_end = data.pos();
for (i, sym) in import.syms.iter().enumerate() {
let rva = hint_name_entry(data, 0, &sym.name);
@@ -40,9 +30,17 @@ pub fn encode(data: &mut ByteEncoder, imports: &[LibImport]) -> DataDir {
// address table
data.align(size_of::<ImportLookupEntry>());
let addr_start = data.pos();
let len = lookup_end - lookup_start;
data.pad(len);
data.data.copy_within(lookup_start..lookup_end, addr_start);
for (i, sym) in import.syms.iter().enumerate() {
let here = data.pos() as i32;
for &usage in &sym.usages {
// NOTE: sets relative offet rn
let code_pos = code_start + usage;
data.set_at::<i32>(code_pos, here - code_pos as i32 - 4);
}
let entry = data[lookup][i];
data.val(&entry);
}
data.pad(size_of::<ImportLookupEntry>());
// entry
data[idt][i] = ImportDirTable {
@@ -69,6 +67,7 @@ pub struct ImportDirTable {
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct ImportLookupEntry(u64);
impl ImportLookupEntry {