diff --git a/README.md b/README.md index e00f6d0..4b3636a 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Features: Supports: - PowerPC 750CL (GameCube & Wii) - MIPS (Nintendo 64 & PS2) -- x86 (PE only at the moment) +- x86 (COFF only at the moment) See [Usage](#usage) for more information. @@ -59,6 +59,10 @@ file as well. You can then add `objdiff.json` to your `.gitignore` to prevent it // objdiff.json { "custom_make": "ninja", + "custom_args": [ + "-d", + "keeprsp" + ], // Only required if objects use "path" instead of "target_path" and "base_path". "target_dir": "build/asm", @@ -92,7 +96,10 @@ file as well. You can then add `objdiff.json` to your `.gitignore` to prevent it ``` `custom_make` _(optional)_: By default, objdiff will use `make` to build the project. -If the project uses a different build system (e.g. `ninja`), specify it here. +If the project uses a different build system (e.g. `ninja`), specify it here. +The build command will be `[custom_make] [custom_args] path/to/object.o`. + +`custom_args` _(optional)_: Additional arguments to pass to the build command prior to the object path. `target_dir` _(optional)_: Relative from the root of the project, this where the "target" or "expected" objects are located. These are the **intended result** of the match. diff --git a/objdiff-core/src/config/mod.rs b/objdiff-core/src/config/mod.rs index 35d90b0..9f0f54b 100644 --- a/objdiff-core/src/config/mod.rs +++ b/objdiff-core/src/config/mod.rs @@ -18,6 +18,8 @@ pub struct ProjectConfig { #[serde(default)] pub custom_make: Option, #[serde(default)] + pub custom_args: Option>, + #[serde(default)] pub target_dir: Option, #[serde(default)] pub base_dir: Option, diff --git a/objdiff-core/src/obj/split_meta.rs b/objdiff-core/src/obj/split_meta.rs index 5a8b3c7..be056b5 100644 --- a/objdiff-core/src/obj/split_meta.rs +++ b/objdiff-core/src/obj/split_meta.rs @@ -87,12 +87,12 @@ impl SplitMeta { if let Some(generator) = &self.generator { write_note_header(writer, e, NT_SPLIT_GENERATOR, generator.len())?; writer.write_all(generator.as_bytes())?; - align_to_4(writer, generator.len())?; + align_data_to_4(writer, generator.len())?; } if let Some(module_name) = &self.module_name { write_note_header(writer, e, NT_SPLIT_MODULE_NAME, module_name.len())?; writer.write_all(module_name.as_bytes())?; - align_to_4(writer, module_name.len())?; + align_data_to_4(writer, module_name.len())?; } if let Some(module_id) = self.module_id { write_note_header(writer, e, NT_SPLIT_MODULE_ID, 4)?; @@ -119,15 +119,19 @@ impl SplitMeta { let mut size = 0; if let Some(generator) = self.generator.as_deref() { size += NOTE_HEADER_SIZE + generator.len(); + size = align_size_to_4(size); } if let Some(module_name) = self.module_name.as_deref() { size += NOTE_HEADER_SIZE + module_name.len(); + size = align_size_to_4(size); } if self.module_id.is_some() { size += NOTE_HEADER_SIZE + 4; + size = align_size_to_4(size); } if let Some(virtual_addresses) = self.virtual_addresses.as_deref() { size += NOTE_HEADER_SIZE + if is_64 { 8 } else { 4 } * virtual_addresses.len(); + size = align_size_to_4(size); } size } @@ -186,7 +190,9 @@ where E: Endian } } -fn align_to_4(writer: &mut W, len: usize) -> io::Result<()> { +fn align_size_to_4(size: usize) -> usize { (size + 3) & !3 } + +fn align_data_to_4(writer: &mut W, len: usize) -> io::Result<()> { const ALIGN_BYTES: &[u8] = &[0; 4]; if len % 4 != 0 { writer.write_all(&ALIGN_BYTES[..4 - len % 4])?; @@ -212,6 +218,6 @@ where writer.write_all(&e.write_u32_bytes(kind))?; // Type writer.write_all(ELF_NOTE_SPLIT)?; // Name writer.write_all(&[0; 1])?; // Null terminator - align_to_4(writer, ELF_NOTE_SPLIT.len() + 1)?; + align_data_to_4(writer, ELF_NOTE_SPLIT.len() + 1)?; Ok(()) } diff --git a/objdiff-gui/src/app.rs b/objdiff-gui/src/app.rs index ff49dcb..bcd125c 100644 --- a/objdiff-gui/src/app.rs +++ b/objdiff-gui/src/app.rs @@ -84,6 +84,8 @@ pub struct AppConfig { #[serde(default)] pub custom_make: Option, #[serde(default)] + pub custom_args: Option>, + #[serde(default)] pub selected_wsl_distro: Option, #[serde(default)] pub project_dir: Option, @@ -131,6 +133,7 @@ impl Default for AppConfig { Self { version: AppConfigVersion::default().version, custom_make: None, + custom_args: None, selected_wsl_distro: None, project_dir: None, target_obj_dir: None, diff --git a/objdiff-gui/src/config.rs b/objdiff-gui/src/config.rs index d6c3ef4..6f866b3 100644 --- a/objdiff-gui/src/config.rs +++ b/objdiff-gui/src/config.rs @@ -71,6 +71,7 @@ pub fn load_project_config(config: &mut AppConfig) -> Result<()> { if let Some((result, info)) = try_project_config(project_dir) { let project_config = result?; config.custom_make = project_config.custom_make; + config.custom_args = project_config.custom_args; config.target_obj_dir = project_config.target_dir.map(|p| project_dir.join(p)); config.base_obj_dir = project_config.base_dir.map(|p| project_dir.join(p)); config.build_base = project_config.build_base; diff --git a/objdiff-gui/src/jobs/objdiff.rs b/objdiff-gui/src/jobs/objdiff.rs index 84edbac..1cb86b2 100644 --- a/objdiff-gui/src/jobs/objdiff.rs +++ b/objdiff-gui/src/jobs/objdiff.rs @@ -39,6 +39,7 @@ impl Default for BuildStatus { pub struct BuildConfig { pub project_dir: Option, pub custom_make: Option, + pub custom_args: Option>, pub selected_wsl_distro: Option, } @@ -47,6 +48,7 @@ impl BuildConfig { Self { project_dir: config.project_dir.clone(), custom_make: config.custom_make.clone(), + custom_args: config.custom_args.clone(), selected_wsl_distro: config.selected_wsl_distro.clone(), } } @@ -96,10 +98,11 @@ pub(crate) fn run_make(config: &BuildConfig, arg: &Path) -> BuildStatus { fn run_make_cmd(config: &BuildConfig, cwd: &Path, arg: &Path) -> Result { let make = config.custom_make.as_deref().unwrap_or("make"); + let make_args = config.custom_args.as_deref().unwrap_or(&[]); #[cfg(not(windows))] let mut command = { let mut command = Command::new(make); - command.current_dir(cwd).arg(arg); + command.current_dir(cwd).args(make_args).arg(arg); command }; #[cfg(windows)] @@ -113,6 +116,13 @@ fn run_make_cmd(config: &BuildConfig, cwd: &Path, arg: &Path) -> Result format!("/{}", new_cwd.to_slash_lossy().as_ref()), + Err(_) => cwd.to_string_lossy().to_string(), + }; + command .arg("--cd") .arg(cwd) @@ -120,9 +130,10 @@ fn run_make_cmd(config: &BuildConfig, cwd: &Path, arg: &Path) -> Result