pass the roc app bytes into the linker

as opposed to opening a file 'within' the linker
This commit is contained in:
Folkert 2022-09-24 23:03:43 +02:00
parent 320aa504cd
commit 89938cc80e
No known key found for this signature in database
GPG key ID: 1F17F6FFD112B97C
3 changed files with 23 additions and 24 deletions

View file

@ -119,11 +119,11 @@ pub fn build_and_preprocess_host(
pub fn link_preprocessed_host(
target: &Triple,
host_input_path: &Path,
roc_app_obj: &Path,
roc_app_bytes: &[u8],
binary_path: &Path,
) {
let metadata = host_input_path.with_file_name("metadata");
surgery(roc_app_obj, &metadata, binary_path, false, false, target)
surgery(roc_app_bytes, &metadata, binary_path, false, false, target)
}
fn generate_dynamic_lib(
@ -1973,7 +1973,7 @@ fn scan_elf_dynamic_deps(
}
fn surgery(
app_filename: &Path,
roc_app_bytes: &[u8],
metadata_filename: &Path,
out_filename: &Path,
verbose: bool,
@ -1983,7 +1983,7 @@ fn surgery(
match target.binary_format {
target_lexicon::BinaryFormat::Elf | target_lexicon::BinaryFormat::Macho => {
surgery_elf_and_macho(
app_filename,
roc_app_bytes,
metadata_filename,
out_filename,
verbose,
@ -1993,7 +1993,7 @@ fn surgery(
}
target_lexicon::BinaryFormat::Coff => {
crate::pe::surgery_pe(out_filename, metadata_filename, app_filename);
crate::pe::surgery_pe(out_filename, metadata_filename, roc_app_bytes);
}
target_lexicon::BinaryFormat::Wasm => {
@ -2015,25 +2015,20 @@ fn surgery(
}
fn surgery_elf_and_macho(
app_path: &Path,
roc_app_bytes: &[u8],
metadata_path: &Path,
executable_path: &Path,
verbose: bool,
time: bool,
target: &Triple,
) {
let app_parsing_start = Instant::now();
let app_mmap = open_mmap(app_path);
let app_data = &*app_mmap;
let app_obj = match object::File::parse(app_data) {
let app_obj = match object::File::parse(roc_app_bytes) {
Ok(obj) => obj,
Err(err) => {
internal_error!("Failed to parse application file: {}", err);
}
};
let app_parsing_duration = app_parsing_start.elapsed();
let total_start = Instant::now();
let loading_metadata_start = total_start;
@ -2041,19 +2036,17 @@ fn surgery_elf_and_macho(
let loading_metadata_duration = loading_metadata_start.elapsed();
let load_and_mmap_start = Instant::now();
let max_out_len = md.exec_len + app_data.len() as u64 + md.load_align_constraint;
let max_out_len = md.exec_len + roc_app_bytes.len() as u64 + md.load_align_constraint;
let mut exec_mmap = open_mmap_mut(executable_path, max_out_len as usize);
let load_and_mmap_duration = load_and_mmap_start.elapsed();
let out_gen_start = Instant::now();
let out_gen_start = Instant::now();
let mut offset = 0;
match target.binary_format {
target_lexicon::BinaryFormat::Elf => {
surgery_elf(verbose, &md, &mut exec_mmap, &mut offset, app_obj)
}
target_lexicon::BinaryFormat::Macho => surgery_macho(
app_path,
metadata_path,
executable_path,
verbose,
@ -2098,13 +2091,11 @@ fn surgery_elf_and_macho(
if verbose || time {
println!("\nTimings");
report_timing("Loading Metadata", loading_metadata_duration);
report_timing("Application Parsing", app_parsing_duration);
report_timing("Loading and mmap-ing", load_and_mmap_duration);
report_timing("Output Generation", out_gen_duration);
report_timing("Flushing Data to Disk", flushing_data_duration);
let sum = loading_metadata_duration
+ app_parsing_duration
+ load_and_mmap_duration
+ out_gen_duration
+ flushing_data_duration;
@ -2116,7 +2107,6 @@ fn surgery_elf_and_macho(
#[allow(clippy::too_many_arguments)]
fn surgery_macho(
_app_filename: &Path,
_metadata_filename: &Path,
_out_filename: &Path,
verbose: bool,

View file

@ -190,11 +190,10 @@ pub(crate) fn preprocess_windows(
Ok(())
}
pub(crate) fn surgery_pe(executable_path: &Path, metadata_path: &Path, app_path: &Path) {
pub(crate) fn surgery_pe(executable_path: &Path, metadata_path: &Path, roc_app_bytes: &[u8]) {
let md = PeMetadata::read_from_file(metadata_path);
let app_bytes = open_mmap(app_path);
let app_obj_sections = AppSections::from_data(&app_bytes);
let app_obj_sections = AppSections::from_data(roc_app_bytes);
let mut symbols = app_obj_sections.symbols;
let image_base: u64 = md.image_base;
@ -278,7 +277,7 @@ pub(crate) fn surgery_pe(executable_path: &Path, metadata_path: &Path, app_path:
let mut offset = section_file_offset;
let it = app_obj_sections.sections.iter().filter(|s| s.kind == kind);
for section in it {
let slice = &app_bytes[section.file_range.start..section.file_range.end];
let slice = &roc_app_bytes[section.file_range.start..section.file_range.end];
executable[offset..][..slice.len()].copy_from_slice(slice);
for (name, app_relocation) in section.relocations.iter() {