mirror of
https://github.com/encounter/decomp-toolkit.git
synced 2025-09-23 03:29:52 +00:00
refactor: rename relocations field and flatten relocs (#115)
This commit is contained in:
parent
9c5210184d
commit
89864dc76e
@ -317,6 +317,10 @@ pub struct ExtractConfig {
|
|||||||
/// Path is relative to `out_dir/include`.
|
/// Path is relative to `out_dir/include`.
|
||||||
#[serde(with = "unix_path_serde_option", default, skip_serializing_if = "Option::is_none")]
|
#[serde(with = "unix_path_serde_option", default, skip_serializing_if = "Option::is_none")]
|
||||||
pub header: Option<Utf8UnixPathBuf>,
|
pub header: Option<Utf8UnixPathBuf>,
|
||||||
|
/// If specified, any relocations within the symbol will be written to the given file in JSON
|
||||||
|
/// format. Path is relative to `out_dir/bin`.
|
||||||
|
#[serde(with = "unix_path_serde_option", default, skip_serializing_if = "Option::is_none")]
|
||||||
|
pub relocations: Option<Utf8UnixPathBuf>,
|
||||||
/// The type for the extracted symbol in the header file. By default, the header will emit
|
/// The type for the extracted symbol in the header file. By default, the header will emit
|
||||||
/// a full symbol declaration (a.k.a. `symbol`), but this can be set to `raw` to emit the raw
|
/// a full symbol declaration (a.k.a. `symbol`), but this can be set to `raw` to emit the raw
|
||||||
/// data as a byte array. `none` avoids emitting a header entirely, in which case the `header`
|
/// data as a byte array. `none` avoids emitting a header entirely, in which case the `header`
|
||||||
@ -403,11 +407,24 @@ pub struct OutputExtract {
|
|||||||
pub binary: Option<Utf8UnixPathBuf>,
|
pub binary: Option<Utf8UnixPathBuf>,
|
||||||
#[serde(with = "unix_path_serde_option")]
|
#[serde(with = "unix_path_serde_option")]
|
||||||
pub header: Option<Utf8UnixPathBuf>,
|
pub header: Option<Utf8UnixPathBuf>,
|
||||||
|
#[serde(with = "unix_path_serde_option")]
|
||||||
|
pub relocations: Option<Utf8UnixPathBuf>,
|
||||||
pub header_type: String,
|
pub header_type: String,
|
||||||
pub custom_type: Option<String>,
|
pub custom_type: Option<String>,
|
||||||
pub custom_data: Option<serde_json::Value>,
|
pub custom_data: Option<serde_json::Value>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize)]
|
||||||
|
struct ExtractRelocInfo {
|
||||||
|
offset: u32,
|
||||||
|
#[serde(rename = "type")]
|
||||||
|
kind: ObjRelocKind,
|
||||||
|
target: String,
|
||||||
|
addend: i64,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
module: Option<u32>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, Default, PartialEq, Eq, Hash)]
|
#[derive(Serialize, Deserialize, Debug, Clone, Default, PartialEq, Eq, Hash)]
|
||||||
pub struct OutputLink {
|
pub struct OutputLink {
|
||||||
pub modules: Vec<String>,
|
pub modules: Vec<String>,
|
||||||
@ -1063,12 +1080,35 @@ fn split_write_obj(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(relocations) = &extract.relocations {
|
||||||
|
let start = symbol.address as u32 - section.address as u32;
|
||||||
|
let end = start + symbol.size as u32;
|
||||||
|
let mut reloc_entries = Vec::new();
|
||||||
|
for (addr, reloc) in section.relocations.range(start..end) {
|
||||||
|
let target_symbol = &module.obj.symbols[reloc.target_symbol];
|
||||||
|
reloc_entries.push(ExtractRelocInfo {
|
||||||
|
offset: addr - start,
|
||||||
|
kind: reloc.kind,
|
||||||
|
target: target_symbol.name.clone(),
|
||||||
|
addend: reloc.addend,
|
||||||
|
module: reloc.module,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
let relocations_json = serde_json::to_vec_pretty(&reloc_entries)?;
|
||||||
|
let out_path = base_dir.join("bin").join(relocations.with_encoding());
|
||||||
|
if let Some(parent) = out_path.parent() {
|
||||||
|
DirBuilder::new().recursive(true).create(parent)?;
|
||||||
|
}
|
||||||
|
write_if_changed(&out_path, &relocations_json)?;
|
||||||
|
}
|
||||||
|
|
||||||
// Copy to output config
|
// Copy to output config
|
||||||
out_config.extract.push(OutputExtract {
|
out_config.extract.push(OutputExtract {
|
||||||
symbol: symbol.name.clone(),
|
symbol: symbol.name.clone(),
|
||||||
rename: extract.rename.clone(),
|
rename: extract.rename.clone(),
|
||||||
binary: extract.binary.clone(),
|
binary: extract.binary.clone(),
|
||||||
header: extract.header.clone(),
|
header: extract.header.clone(),
|
||||||
|
relocations: extract.relocations.clone(),
|
||||||
header_type: header_kind.to_string(),
|
header_type: header_kind.to_string(),
|
||||||
custom_type: extract.custom_type.clone(),
|
custom_type: extract.custom_type.clone(),
|
||||||
custom_data: extract.custom_data.clone(),
|
custom_data: extract.custom_data.clone(),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user