Add `auto_force_active` option (disable to support `-code_merging`)

Fixes #13
This commit is contained in:
Luke Street 2024-01-13 21:54:10 -07:00
parent 5a3256b2b6
commit 968f50ebed
6 changed files with 12 additions and 8 deletions

2
Cargo.lock generated
View File

@ -295,7 +295,7 @@ dependencies = [
[[package]] [[package]]
name = "decomp-toolkit" name = "decomp-toolkit"
version = "0.7.0" version = "0.7.1"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"ar", "ar",

View File

@ -3,7 +3,7 @@ name = "decomp-toolkit"
description = "Yet another GameCube/Wii decompilation toolkit." description = "Yet another GameCube/Wii decompilation toolkit."
authors = ["Luke Street <luke@street.dev>"] authors = ["Luke Street <luke@street.dev>"]
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
version = "0.7.0" version = "0.7.1"
edition = "2021" edition = "2021"
publish = false publish = false
repository = "https://github.com/encounter/decomp-toolkit" repository = "https://github.com/encounter/decomp-toolkit"

View File

@ -225,9 +225,12 @@ pub struct ProjectConfig {
/// and instead assumes that all symbols are known. /// and instead assumes that all symbols are known.
#[serde(default, skip_serializing_if = "is_default")] #[serde(default, skip_serializing_if = "is_default")]
pub symbols_known: bool, pub symbols_known: bool,
/// Fills gaps between symbols with /// Fills gaps between symbols to avoid linker realignment.
#[serde(default = "bool_true", skip_serializing_if = "is_true")] #[serde(default = "bool_true", skip_serializing_if = "is_true")]
pub fill_gaps: bool, pub fill_gaps: bool,
/// Marks all emitted symbols as "force active" to prevent the linker from removing them.
#[serde(default = "bool_true", skip_serializing_if = "is_true")]
pub auto_force_active: bool,
} }
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
@ -859,7 +862,7 @@ fn split_write_obj(
entry, entry,
}; };
for (unit, split_obj) in module.obj.link_order.iter().zip(&split_objs) { for (unit, split_obj) in module.obj.link_order.iter().zip(&split_objs) {
let out_obj = write_elf(split_obj)?; let out_obj = write_elf(split_obj, config.auto_force_active)?;
let out_path = obj_dir.join(obj_path_for_unit(&unit.name)); let out_path = obj_dir.join(obj_path_for_unit(&unit.name));
out_config.units.push(OutputUnit { out_config.units.push(OutputUnit {
object: out_path.clone(), object: out_path.clone(),
@ -1763,6 +1766,7 @@ fn config(args: ConfigArgs) -> Result<()> {
common_start: None, common_start: None,
symbols_known: false, symbols_known: false,
fill_gaps: true, fill_gaps: true,
auto_force_active: true,
}; };
let mut modules = Vec::<(u32, ModuleConfig)>::new(); let mut modules = Vec::<(u32, ModuleConfig)>::new();

View File

@ -185,7 +185,7 @@ fn split(args: SplitArgs) -> Result<()> {
let split_objs = split_obj(&obj)?; let split_objs = split_obj(&obj)?;
for (unit, split_obj) in obj.link_order.iter().zip(&split_objs) { for (unit, split_obj) in obj.link_order.iter().zip(&split_objs) {
let out_obj = write_elf(split_obj)?; let out_obj = write_elf(split_obj, false)?;
match file_map.entry(unit.name.clone()) { match file_map.entry(unit.name.clone()) {
hash_map::Entry::Vacant(e) => e.insert(out_obj), hash_map::Entry::Vacant(e) => e.insert(out_obj),
hash_map::Entry::Occupied(_) => bail!("Duplicate file {}", unit.name), hash_map::Entry::Occupied(_) => bail!("Duplicate file {}", unit.name),

View File

@ -579,7 +579,7 @@ fn merge(args: MergeArgs) -> Result<()> {
// Write ELF // Write ELF
log::info!("Writing {}", args.out_file.display()); log::info!("Writing {}", args.out_file.display());
fs::write(&args.out_file, write_elf(&obj)?)?; fs::write(&args.out_file, write_elf(&obj, false)?)?;
Ok(()) Ok(())
} }

View File

@ -346,7 +346,7 @@ where P: AsRef<Path> {
Ok(obj) Ok(obj)
} }
pub fn write_elf(obj: &ObjInfo) -> Result<Vec<u8>> { pub fn write_elf(obj: &ObjInfo, force_active: bool) -> Result<Vec<u8>> {
let mut out_data = Vec::new(); let mut out_data = Vec::new();
let mut writer = object::write::elf::Writer::new(Endianness::Big, false, &mut out_data); let mut writer = object::write::elf::Writer::new(Endianness::Big, false, &mut out_data);
@ -540,7 +540,7 @@ pub fn write_elf(obj: &ObjInfo) -> Result<Vec<u8>> {
out_symbols.push(OutSymbol { index, sym }); out_symbols.push(OutSymbol { index, sym });
symbol_map[symbol_index] = Some(index.0); symbol_map[symbol_index] = Some(index.0);
if let Some(comment_data) = &mut comment_data { if let Some(comment_data) = &mut comment_data {
CommentSym::from(symbol, true).to_writer_static(comment_data, Endian::Big)?; CommentSym::from(symbol, force_active).to_writer_static(comment_data, Endian::Big)?;
} }
} }