use std::path::Path;
use std::process::Command;
const RSLEIGH_BIN: &str = env!("CARGO_BIN_EXE_rsleigh");
fn build_mipsel_elf() -> Vec<u8> {
let text_addr: u32 = 0x0040_0000;
let text_size: u32 = 0x40;
let jal_target = (text_addr + 0x20) >> 2;
let jal_word: u32 = 0x0c00_0000 | jal_target;
let mut text = Vec::with_capacity(text_size as usize);
text.extend_from_slice(&jal_word.to_le_bytes()); text.extend_from_slice(&0u32.to_le_bytes()); text.extend_from_slice(&0x03e00008u32.to_le_bytes()); text.extend_from_slice(&0u32.to_le_bytes()); text.resize(0x20, 0); text.extend_from_slice(&0x03e00008u32.to_le_bytes()); text.extend_from_slice(&0u32.to_le_bytes()); text.resize(text_size as usize, 0);
let mut buf: Vec<u8> = vec![
0x7f, b'E', b'L', b'F', 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2, 0, 8, 0, 1, 0, 0, 0, ];
buf.extend_from_slice(&text_addr.to_le_bytes()); buf.extend_from_slice(&0u32.to_le_bytes()); buf.extend_from_slice(&0x34u32.to_le_bytes()); buf.extend_from_slice(&0u32.to_le_bytes()); buf.extend_from_slice(&[0x34, 0]); buf.extend_from_slice(&[0, 0]); buf.extend_from_slice(&[0, 0]); buf.extend_from_slice(&[0x28, 0]); buf.extend_from_slice(&[3, 0]); buf.extend_from_slice(&[2, 0]);
buf.extend(std::iter::repeat(0).take(40));
buf.extend_from_slice(&1u32.to_le_bytes()); buf.extend_from_slice(&1u32.to_le_bytes()); buf.extend_from_slice(&6u32.to_le_bytes()); buf.extend_from_slice(&text_addr.to_le_bytes()); buf.extend_from_slice(&0xc0u32.to_le_bytes()); buf.extend_from_slice(&text_size.to_le_bytes()); buf.extend_from_slice(&0u32.to_le_bytes()); buf.extend_from_slice(&0u32.to_le_bytes()); buf.extend_from_slice(&4u32.to_le_bytes()); buf.extend_from_slice(&0u32.to_le_bytes()); buf.extend_from_slice(&7u32.to_le_bytes());
buf.extend_from_slice(&3u32.to_le_bytes());
buf.extend_from_slice(&0u32.to_le_bytes());
buf.extend_from_slice(&0u32.to_le_bytes());
buf.extend_from_slice(&0xacu32.to_le_bytes());
buf.extend_from_slice(&0x11u32.to_le_bytes());
buf.extend_from_slice(&0u32.to_le_bytes());
buf.extend_from_slice(&0u32.to_le_bytes());
buf.extend_from_slice(&1u32.to_le_bytes());
buf.extend_from_slice(&0u32.to_le_bytes());
assert_eq!(buf.len(), 0xac);
buf.extend_from_slice(b"\0.text\0.shstrtab\0");
buf.extend_from_slice(&[0u8; 3]);
assert_eq!(buf.len(), 0xc0);
buf.extend_from_slice(&text);
buf
}
#[test]
fn mipsel_jal_target_discovered() {
let elf = build_mipsel_elf();
let mut path = std::env::temp_dir();
path.push("rsleigh_mipsel_discovery_test.elf");
std::fs::write(&path, &elf).expect("write tmp ELF");
assert!(Path::new(&path).exists());
let out = Command::new(RSLEIGH_BIN)
.arg(&path)
.output()
.expect("rsleigh invocation");
let _ = std::fs::remove_file(&path);
assert!(
out.status.success(),
"rsleigh failed:\n{}",
String::from_utf8_lossy(&out.stderr)
);
let stdout = String::from_utf8(out.stdout).expect("utf-8");
assert!(
stdout.contains("0x00400000"),
"missing entry function:\n{}",
stdout
);
assert!(
stdout.contains("0x00400020"),
"JAL target not discovered — endian-aware fix regressed:\n{}",
stdout
);
}