use linker_lang::{Linker, Object, Width};
fn main() {
let mut code = Object::new("code.o");
code.section(".text", vec![0u8; 12]);
code.define("main", ".text", 0);
code.define("handler", ".text", 6);
let mut data = Object::new("data.o");
data.section(".data", vec![0u8; 8]);
data.relocate(".data", 0, "handler", Width::U64, 0);
let image = Linker::new()
.base_address(0x40_0000)
.entry("main")
.link(&[code, data])
.expect("every referenced symbol is defined");
print!("{image}");
let slot = image.section(".data").unwrap().data();
let patched = u64::from_le_bytes(slot.try_into().unwrap());
println!("\n.data slot holds {patched:#x}, the address of `handler`");
assert_eq!(patched, image.symbol("handler").unwrap());
}