39 lines
1.5 KiB
Rust
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");
|
|
}
|