This repository has been archived on 2026-10-10. You can view files and clone it, but cannot push or open issues or pull requests.
molotov/crates/molotov-core/tests/linker_pipeline_test.rs

39 lines
1.5 KiB
Rust

// SPDX-License-Identifier: GPL-3.0-or-later
use molotov_core::elf::ElfBinary;
use molotov_core::linker::BionicLinker;
use molotov_core::symbols::SymbolCategory;
#[test]
fn test_linker_end_to_end_relocation_and_protection() {
let mut linker = BionicLinker::new();
linker.triage_mut().register("cordial_test_func", SymbolCategory::Cordial);
// Verify resolve_symbol API exists on linker
let resolved = linker.resolve_symbol("cordial_test_func");
assert!(resolved.is_some(), "Cordial symbol should resolve via linker");
}
#[test]
fn test_elf_rejects_truncated_segments() {
let mut header = vec![0u8; 64 + 56];
// e_ident
header[0..4].copy_from_slice(b"\x7fELF");
header[4] = 2; // ELFCLASS64
header[5] = 1; // Little endian
header[16] = 3; // ET_DYN
header[18] = 62; // EM_X86_64
header[32..40].copy_from_slice(&64u64.to_le_bytes()); // phoff = 64
header[54] = 56; // phentsize
header[56] = 1; // phnum = 1
// Program header 0: p_offset = 1000, p_filesz = 500 (extends beyond file length 120)
let ph = &mut header[64..120];
ph[0..4].copy_from_slice(&1u32.to_le_bytes()); // PT_LOAD
ph[8..16].copy_from_slice(&1000u64.to_le_bytes()); // p_offset
ph[32..40].copy_from_slice(&500u64.to_le_bytes()); // p_filesz
let elf = ElfBinary::parse(&header).expect("Header parse should succeed");
let linker = BionicLinker::new();
let res = linker.load_from_elf(&elf);
assert!(res.is_err(), "Must reject truncated segments whose data extends beyond file bounds");
}