mirror of
https://github.com/italicsjenga/agb.git
synced 2024-12-23 16:21:33 +11:00
Add the correct header
This commit is contained in:
parent
aa77255720
commit
dce7a6726e
17
agb-gbafix/Cargo.lock
generated
17
agb-gbafix/Cargo.lock
generated
|
@ -6,11 +6,28 @@ version = 3
|
||||||
name = "agb-gbafix"
|
name = "agb-gbafix"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"bytemuck",
|
||||||
"elf",
|
"elf",
|
||||||
|
"gbafix",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bytemuck"
|
||||||
|
version = "1.13.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "elf"
|
name = "elf"
|
||||||
version = "0.7.2"
|
version = "0.7.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e2b183d6ce6ca4cf30e3db37abf5b52568b5f9015c97d9fbdd7026aa5dcdd758"
|
checksum = "e2b183d6ce6ca4cf30e3db37abf5b52568b5f9015c97d9fbdd7026aa5dcdd758"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "gbafix"
|
||||||
|
version = "1.0.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f7e47af9d5377b8b0def53d9916f6c28521f2e5b97c5fec137797417c26ab4b7"
|
||||||
|
dependencies = [
|
||||||
|
"bytemuck",
|
||||||
|
]
|
||||||
|
|
|
@ -6,4 +6,6 @@ edition = "2021"
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
elf = "0.7"
|
elf = "0.7"
|
||||||
|
gbafix = "1"
|
||||||
|
bytemuck = "1"
|
|
@ -1,6 +1,6 @@
|
||||||
use std::{
|
use std::{
|
||||||
fs,
|
fs,
|
||||||
io::{self, Write},
|
io::{BufWriter, Write},
|
||||||
path::PathBuf,
|
path::PathBuf,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -11,16 +11,16 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
|
||||||
let elf_file = elf::ElfBytes::<elf::endian::AnyEndian>::minimal_parse(file_data)?;
|
let elf_file = elf::ElfBytes::<elf::endian::AnyEndian>::minimal_parse(file_data)?;
|
||||||
|
|
||||||
let (section_headers, strtab) = elf_file.section_headers_with_strtab()?;
|
let section_headers = elf_file
|
||||||
let section_headers = section_headers.expect("Expected section headers");
|
.section_headers()
|
||||||
let strtab = strtab.expect("Expected string table");
|
.expect("Expected section headers");
|
||||||
|
|
||||||
let output = fs::File::create("out.gba")?;
|
let mut output = BufWriter::new(fs::File::create("out.gba")?);
|
||||||
let mut buf_writer = io::BufWriter::new(output);
|
|
||||||
|
|
||||||
|
let mut header = gbafix::GBAHeader::default();
|
||||||
|
|
||||||
|
let mut written_header = false;
|
||||||
for section_header in section_headers.iter() {
|
for section_header in section_headers.iter() {
|
||||||
let section_name = strtab.get(section_header.sh_name as usize)?;
|
|
||||||
|
|
||||||
const SHT_NOBITS: u32 = 8;
|
const SHT_NOBITS: u32 = 8;
|
||||||
const SHT_NULL: u32 = 0;
|
const SHT_NULL: u32 = 0;
|
||||||
const SHF_ALLOC: u64 = 2;
|
const SHF_ALLOC: u64 = 2;
|
||||||
|
@ -31,17 +31,31 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
println!("{section_name}");
|
let (mut data, compression) = elf_file.section_data(§ion_header)?;
|
||||||
|
|
||||||
let (data, compression) = elf_file.section_data(§ion_header)?;
|
|
||||||
if let Some(compression) = compression {
|
if let Some(compression) = compression {
|
||||||
panic!("Cannot decompress elf content, but got compression header {compression:?}");
|
panic!("Cannot decompress elf content, but got compression header {compression:?}");
|
||||||
}
|
}
|
||||||
|
|
||||||
buf_writer.write_all(data)?;
|
if !written_header {
|
||||||
|
assert!(
|
||||||
|
data.len() > 192,
|
||||||
|
"first section must be at least as big as the gba header"
|
||||||
|
);
|
||||||
|
|
||||||
|
header.start_code = data[0..4].try_into().unwrap();
|
||||||
|
header.update_checksum();
|
||||||
|
|
||||||
|
let header_bytes = bytemuck::bytes_of(&header);
|
||||||
|
output.write_all(header_bytes)?;
|
||||||
|
|
||||||
|
data = &data[192..];
|
||||||
|
written_header = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
output.write_all(data)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf_writer.flush()?;
|
output.flush()?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue