From eae8a2ea372576912d9bc866d5b96bb4763f00f3 Mon Sep 17 00:00:00 2001 From: Brendan Hansknecht Date: Fri, 24 Sep 2021 13:43:00 -0700 Subject: [PATCH 1/5] Add surgical linker to cli_run tests that don't use rust --- cli/tests/cli_run.rs | 28 ++++++++++++++++++++++++++-- examples/hello-rust/.gitignore | 2 +- examples/hello-rust/Hello.roc | 2 +- linker/README.md | 1 - linker/src/lib.rs | 1 + 5 files changed, 29 insertions(+), 5 deletions(-) diff --git a/cli/tests/cli_run.rs b/cli/tests/cli_run.rs index aa7020700f..6b0f34780b 100644 --- a/cli/tests/cli_run.rs +++ b/cli/tests/cli_run.rs @@ -18,6 +18,13 @@ mod cli_run { #[cfg(not(debug_assertions))] use roc_collections::all::MutMap; + #[cfg(target_os = "linux")] + const TEST_SURGICAL_LINKER: bool = true; + + // Surgical linker currently only supports linux. + #[cfg(not(target_os = "linux"))] + const TEST_SURGICAL_LINKER: bool = false; + #[cfg(not(target_os = "macos"))] const ALLOW_VALGRIND: bool = true; @@ -136,7 +143,6 @@ mod cli_run { ); } } - /// This macro does two things. /// /// First, it generates and runs a separate test for each of the given @@ -184,6 +190,24 @@ mod cli_run { example.expected_ending, example.use_valgrind, ); + + // Also check with the surgical linker. + + if TEST_SURGICAL_LINKER { + if matches!(example.executable_filename, "echo" | "hello-rust") { + eprintln!("WARNING: skipping testing example {} with surgical linking because rust is currently not supported!", example.filename); + return; + } + + check_output_with_stdin( + &file_name, + example.stdin, + example.executable_filename, + &["--roc-linker"], + example.expected_ending, + example.use_valgrind, + ); + } } )* @@ -228,7 +252,7 @@ mod cli_run { }, hello_rust:"hello-rust" => Example { filename: "Hello.roc", - executable_filename: "hello-world", + executable_filename: "hello-rust", stdin: &[], expected_ending:"Hello, World!\n", use_valgrind: true, diff --git a/examples/hello-rust/.gitignore b/examples/hello-rust/.gitignore index 6b820fd903..8485821d7c 100644 --- a/examples/hello-rust/.gitignore +++ b/examples/hello-rust/.gitignore @@ -1 +1 @@ -hello-world +hello-rust diff --git a/examples/hello-rust/Hello.roc b/examples/hello-rust/Hello.roc index d78f48ff19..cd7092308d 100644 --- a/examples/hello-rust/Hello.roc +++ b/examples/hello-rust/Hello.roc @@ -1,4 +1,4 @@ -app "hello-world" +app "hello-rust" packages { base: "platform" } imports [] provides [ main ] to base diff --git a/linker/README.md b/linker/README.md index 0d1e2d77ee..d65d68e14b 100644 --- a/linker/README.md +++ b/linker/README.md @@ -31,7 +31,6 @@ This linker is run in 2 phases: preprocessing and surigical linking. ## TODO (In a lightly prioritized order) -- Run CLI tests and/or benchmarks with the Roc Linker. - Test with an executable completely generated by Cargo (It will hopefully work out of the box like zig). - Add Macho support - Honestly should be almost exactly the same code. diff --git a/linker/src/lib.rs b/linker/src/lib.rs index 1a043fbce1..3fa53e1bbd 100644 --- a/linker/src/lib.rs +++ b/linker/src/lib.rs @@ -199,6 +199,7 @@ fn generate_dynamic_lib( // TODO properly generate this list. for name in &[ format!("roc__{}_1_exposed", sym), + format!("roc__{}_1_exposed_generic", sym), format!("roc__{}_1_Fx_caller", sym), format!("roc__{}_1_Fx_size", sym), format!("roc__{}_1_Fx_result_size", sym), From 411ed58eecaaa4d17ef4a5474b3c926c8b3fa48d Mon Sep 17 00:00:00 2001 From: Brendan Hansknecht Date: Fri, 24 Sep 2021 21:37:07 -0700 Subject: [PATCH 2/5] Fix rust host with surgical linking --- cli/tests/cli_run.rs | 5 - compiler/build/src/link.rs | 29 +- examples/cli/platform/Cargo.toml | 10 +- examples/cli/platform/build.rs | 4 + examples/cli/platform/host.c | 6 +- examples/cli/platform/src/lib.rs | 26 +- examples/cli/platform/src/main.rs | 64 +++ examples/hello-rust/platform/Cargo.toml | 9 +- examples/hello-rust/platform/build.rs | 4 + examples/hello-rust/platform/host.c | 11 +- examples/hello-rust/platform/src/lib.rs | 20 +- examples/hello-rust/platform/src/main.rs | 51 ++ linker/README.md | 2 +- linker/src/lib.rs | 87 ++- linker/src/metadata.rs | 8 +- ult = result ^ roc_memcpy_ptr | 651 +++++++++++++++++++++++ 16 files changed, 920 insertions(+), 67 deletions(-) create mode 100644 examples/cli/platform/build.rs create mode 100644 examples/cli/platform/src/main.rs create mode 100644 examples/hello-rust/platform/build.rs create mode 100644 examples/hello-rust/platform/src/main.rs create mode 100644 ult = result ^ roc_memcpy_ptr diff --git a/cli/tests/cli_run.rs b/cli/tests/cli_run.rs index 6b0f34780b..718f9df4bf 100644 --- a/cli/tests/cli_run.rs +++ b/cli/tests/cli_run.rs @@ -194,11 +194,6 @@ mod cli_run { // Also check with the surgical linker. if TEST_SURGICAL_LINKER { - if matches!(example.executable_filename, "echo" | "hello-rust") { - eprintln!("WARNING: skipping testing example {} with surgical linking because rust is currently not supported!", example.filename); - return; - } - check_output_with_stdin( &file_name, example.stdin, diff --git a/compiler/build/src/link.rs b/compiler/build/src/link.rs index 40a8f84cbf..4764493911 100644 --- a/compiler/build/src/link.rs +++ b/compiler/build/src/link.rs @@ -370,7 +370,7 @@ pub fn rebuild_host( } else if cargo_host_src.exists() { // Compile and link Cargo.toml, if it exists let cargo_dir = host_input_path.parent().unwrap(); - let libhost_dir = + let cargo_out_dir = cargo_dir .join("target") .join(if matches!(opt_level, OptLevel::Optimize) { @@ -378,30 +378,29 @@ pub fn rebuild_host( } else { "debug" }); - let libhost = libhost_dir.join("libhost.a"); let mut command = Command::new("cargo"); command.arg("build").current_dir(cargo_dir); if matches!(opt_level, OptLevel::Optimize) { command.arg("--release"); } + let source_file = if shared_lib_path.is_some() { + command.args(&["--bin", "host"]); + "src/main.rs" + } else { + command.arg("--lib"); + "src/lib.rs" + }; let output = command.output().unwrap(); - validate_output("src/lib.rs", "cargo build", output); + validate_output(source_file, "cargo build", output); - // Cargo hosts depend on a c wrapper for the api. Compile host.c as well. if shared_lib_path.is_some() { - // If compiling to executable, let c deal with linking as well. - let output = build_c_host_native( - &env_path, - &env_home, - host_dest_native.to_str().unwrap(), - &[c_host_src.to_str().unwrap(), libhost.to_str().unwrap()], - opt_level, - shared_lib_path, - ); - validate_output("host.c", "clang", output); + // For surgical linking, just copy the dynamically linked rust app. + std::fs::copy(cargo_out_dir.join("host"), host_dest_native).unwrap(); } else { + // Cargo hosts depend on a c wrapper for the api. Compile host.c as well. + let output = build_c_host_native( &env_path, &env_home, @@ -418,7 +417,7 @@ pub fn rebuild_host( .args(&[ "-r", "-L", - libhost_dir.to_str().unwrap(), + cargo_out_dir.to_str().unwrap(), c_host_dest.to_str().unwrap(), "-lhost", "-o", diff --git a/examples/cli/platform/Cargo.toml b/examples/cli/platform/Cargo.toml index ad2bc7c449..eba1dfa680 100644 --- a/examples/cli/platform/Cargo.toml +++ b/examples/cli/platform/Cargo.toml @@ -5,8 +5,16 @@ authors = ["The Roc Contributors"] license = "UPL-1.0" edition = "2018" +links = "app" + [lib] -crate-type = ["staticlib"] +name = "host" +path = "src/lib.rs" +crate-type = ["staticlib", "rlib"] + +[[bin]] +name = "host" +path = "src/main.rs" [dependencies] roc_std = { path = "../../../roc_std" } diff --git a/examples/cli/platform/build.rs b/examples/cli/platform/build.rs new file mode 100644 index 0000000000..73159e387c --- /dev/null +++ b/examples/cli/platform/build.rs @@ -0,0 +1,4 @@ +fn main() { + println!("cargo:rustc-link-lib=dylib=app"); + println!("cargo:rustc-link-search=."); +} diff --git a/examples/cli/platform/host.c b/examples/cli/platform/host.c index 0378c69589..645d900c8e 100644 --- a/examples/cli/platform/host.c +++ b/examples/cli/platform/host.c @@ -1,7 +1,3 @@ -#include - extern int rust_main(); -int main() { - return rust_main(); -} +int main() { return rust_main(); } diff --git a/examples/cli/platform/src/lib.rs b/examples/cli/platform/src/lib.rs index 2b24da5ff7..d313d6f424 100644 --- a/examples/cli/platform/src/lib.rs +++ b/examples/cli/platform/src/lib.rs @@ -27,12 +27,12 @@ extern "C" { } #[no_mangle] -pub unsafe fn roc_alloc(size: usize, _alignment: u32) -> *mut c_void { +pub unsafe extern "C" fn roc_alloc(size: usize, _alignment: u32) -> *mut c_void { libc::malloc(size) } #[no_mangle] -pub unsafe fn roc_realloc( +pub unsafe extern "C" fn roc_realloc( c_ptr: *mut c_void, new_size: usize, _old_size: usize, @@ -42,12 +42,12 @@ pub unsafe fn roc_realloc( } #[no_mangle] -pub unsafe fn roc_dealloc(c_ptr: *mut c_void, _alignment: u32) { +pub unsafe extern "C" fn roc_dealloc(c_ptr: *mut c_void, _alignment: u32) { libc::free(c_ptr) } #[no_mangle] -pub unsafe fn roc_panic(c_ptr: *mut c_void, tag_id: u32) { +pub unsafe extern "C" fn roc_panic(c_ptr: *mut c_void, tag_id: u32) { match tag_id { 0 => { let slice = CStr::from_ptr(c_ptr as *const c_char); @@ -60,7 +60,17 @@ pub unsafe fn roc_panic(c_ptr: *mut c_void, tag_id: u32) { } #[no_mangle] -pub fn rust_main() -> isize { +pub unsafe extern "C" fn roc_memcpy(dst: *mut c_void, src: *mut c_void, n: usize) -> *mut c_void { + libc::memcpy(dst, src, n) +} + +#[no_mangle] +pub unsafe extern "C" fn roc_memset(dst: *mut c_void, c: i32, n: usize) -> *mut c_void { + libc::memset(dst, c, n) +} + +#[no_mangle] +pub extern "C" fn rust_main() -> isize { let size = unsafe { roc_main_size() } as usize; let layout = Layout::array::(size).unwrap(); @@ -81,7 +91,7 @@ pub fn rust_main() -> isize { 0 } -unsafe fn call_the_closure(closure_data_ptr: *const u8) -> i64 { +unsafe extern "C" fn call_the_closure(closure_data_ptr: *const u8) -> i64 { let size = size_Fx_result() as usize; let layout = Layout::array::(size).unwrap(); let buffer = std::alloc::alloc(layout) as *mut u8; @@ -99,7 +109,7 @@ unsafe fn call_the_closure(closure_data_ptr: *const u8) -> i64 { } #[no_mangle] -pub fn roc_fx_getLine() -> RocStr { +pub extern "C" fn roc_fx_getLine() -> RocStr { use std::io::{self, BufRead}; let stdin = io::stdin(); @@ -109,7 +119,7 @@ pub fn roc_fx_getLine() -> RocStr { } #[no_mangle] -pub fn roc_fx_putLine(line: RocStr) -> () { +pub extern "C" fn roc_fx_putLine(line: RocStr) -> () { let bytes = line.as_slice(); let string = unsafe { std::str::from_utf8_unchecked(bytes) }; println!("{}", string); diff --git a/examples/cli/platform/src/main.rs b/examples/cli/platform/src/main.rs new file mode 100644 index 0000000000..0d2ec6edb1 --- /dev/null +++ b/examples/cli/platform/src/main.rs @@ -0,0 +1,64 @@ +#![allow(non_snake_case)] + +use core::ffi::c_void; +use roc_std::RocStr; + +fn main() { + let mut result = host::rust_main(); + // This is stupid code that does nothing to avoid rust optimizing functions that roc needs away. + if result == 0x1234_5678_9ABC_DEF0 { + let roc_alloc_ptr: isize = unsafe { + std::mem::transmute( + host::roc_alloc as *const unsafe extern "C" fn(usize, u32) -> *mut c_void, + ) + }; + let roc_realloc_ptr: isize = unsafe { + std::mem::transmute( + host::roc_realloc + as *const unsafe extern "C" fn(*mut c_void, usize, usize, u32) -> *mut c_void, + ) + }; + let roc_dealloc_ptr: isize = unsafe { + std::mem::transmute(host::roc_dealloc as *const unsafe extern "C" fn(*mut c_void, u32)) + }; + let roc_panic_ptr: isize = unsafe { + std::mem::transmute(host::roc_panic as *const unsafe extern "C" fn(*mut c_void, u32)) + }; + let roc_memcpy_ptr: isize = unsafe { + std::mem::transmute( + host::roc_memcpy + as *const unsafe extern "C" fn(*mut c_void, *mut c_void, usize) -> *mut c_void, + ) + }; + let roc_memset_ptr: isize = unsafe { + std::mem::transmute( + host::roc_memset + as *const unsafe extern "C" fn(*mut c_void, i32, usize) -> *mut c_void, + ) + }; + let roc_fx_putLine_ptr: isize = unsafe { + std::mem::transmute(host::roc_fx_putLine as *const extern "C" fn(line: RocStr) -> ()) + }; + let roc_fx_getLine_ptr: isize = unsafe { + std::mem::transmute(host::roc_fx_getLine as *const extern "C" fn() -> RocStr) + }; + // I really want to use the equivalent of std::hint::black_box, but it is expirimental. + result = result ^ roc_alloc_ptr; + result = result ^ roc_realloc_ptr; + result = result ^ roc_dealloc_ptr; + result = result ^ roc_panic_ptr; + result = result ^ roc_memcpy_ptr; + result = result ^ roc_memset_ptr; + result = result ^ roc_fx_putLine_ptr; + result = result ^ roc_fx_getLine_ptr; + result = result ^ roc_alloc_ptr; + result = result ^ roc_realloc_ptr; + result = result ^ roc_dealloc_ptr; + result = result ^ roc_panic_ptr; + result = result ^ roc_memcpy_ptr; + result = result ^ roc_memset_ptr; + result = result ^ roc_fx_putLine_ptr; + result = result ^ roc_fx_getLine_ptr; + } + std::process::exit(result as i32); +} diff --git a/examples/hello-rust/platform/Cargo.toml b/examples/hello-rust/platform/Cargo.toml index ad2bc7c449..72f534c88e 100644 --- a/examples/hello-rust/platform/Cargo.toml +++ b/examples/hello-rust/platform/Cargo.toml @@ -4,9 +4,16 @@ version = "0.1.0" authors = ["The Roc Contributors"] license = "UPL-1.0" edition = "2018" +links = "app" [lib] -crate-type = ["staticlib"] +name = "host" +path = "src/lib.rs" +crate-type = ["staticlib", "rlib"] + +[[bin]] +name = "host" +path = "src/main.rs" [dependencies] roc_std = { path = "../../../roc_std" } diff --git a/examples/hello-rust/platform/build.rs b/examples/hello-rust/platform/build.rs new file mode 100644 index 0000000000..73159e387c --- /dev/null +++ b/examples/hello-rust/platform/build.rs @@ -0,0 +1,4 @@ +fn main() { + println!("cargo:rustc-link-lib=dylib=app"); + println!("cargo:rustc-link-search=."); +} diff --git a/examples/hello-rust/platform/host.c b/examples/hello-rust/platform/host.c index 9b91965724..b9214bcf33 100644 --- a/examples/hello-rust/platform/host.c +++ b/examples/hello-rust/platform/host.c @@ -1,12 +1,3 @@ -#include -#include - extern int rust_main(); -int main() { return rust_main(); } - -void *roc_memcpy(void *dest, const void *src, size_t n) { - return memcpy(dest, src, n); -} - -void *roc_memset(void *str, int c, size_t n) { return memset(str, c, n); } \ No newline at end of file +int main() { return rust_main(); } \ No newline at end of file diff --git a/examples/hello-rust/platform/src/lib.rs b/examples/hello-rust/platform/src/lib.rs index 6a78b4db0c..d81192b939 100644 --- a/examples/hello-rust/platform/src/lib.rs +++ b/examples/hello-rust/platform/src/lib.rs @@ -12,12 +12,12 @@ extern "C" { } #[no_mangle] -pub unsafe fn roc_alloc(size: usize, _alignment: u32) -> *mut c_void { +pub unsafe extern "C" fn roc_alloc(size: usize, _alignment: u32) -> *mut c_void { return libc::malloc(size); } #[no_mangle] -pub unsafe fn roc_realloc( +pub unsafe extern "C" fn roc_realloc( c_ptr: *mut c_void, new_size: usize, _old_size: usize, @@ -27,12 +27,12 @@ pub unsafe fn roc_realloc( } #[no_mangle] -pub unsafe fn roc_dealloc(c_ptr: *mut c_void, _alignment: u32) { +pub unsafe extern "C" fn roc_dealloc(c_ptr: *mut c_void, _alignment: u32) { return libc::free(c_ptr); } #[no_mangle] -pub unsafe fn roc_panic(c_ptr: *mut c_void, tag_id: u32) { +pub unsafe extern "C" fn roc_panic(c_ptr: *mut c_void, tag_id: u32) { match tag_id { 0 => { let slice = CStr::from_ptr(c_ptr as *const c_char); @@ -45,7 +45,17 @@ pub unsafe fn roc_panic(c_ptr: *mut c_void, tag_id: u32) { } #[no_mangle] -pub fn rust_main() -> isize { +pub unsafe extern "C" fn roc_memcpy(dst: *mut c_void, src: *mut c_void, n: usize) -> *mut c_void { + libc::memcpy(dst, src, n) +} + +#[no_mangle] +pub unsafe extern "C" fn roc_memset(dst: *mut c_void, c: i32, n: usize) -> *mut c_void { + libc::memset(dst, c, n) +} + +#[no_mangle] +pub extern "C" fn rust_main() -> isize { unsafe { let roc_str = roc_main(); diff --git a/examples/hello-rust/platform/src/main.rs b/examples/hello-rust/platform/src/main.rs new file mode 100644 index 0000000000..49cefd692f --- /dev/null +++ b/examples/hello-rust/platform/src/main.rs @@ -0,0 +1,51 @@ +use core::ffi::c_void; + +fn main() { + let mut result = host::rust_main(); + // This is stupid code that does nothing to avoid rust optimizing functions that roc needs away. + if result == 0x1234_5678_9ABC_DEF0 { + let roc_alloc_ptr: isize = unsafe { + std::mem::transmute( + host::roc_alloc as *const unsafe extern "C" fn(usize, u32) -> *mut c_void, + ) + }; + let roc_realloc_ptr: isize = unsafe { + std::mem::transmute( + host::roc_realloc + as *const unsafe extern "C" fn(*mut c_void, usize, usize, u32) -> *mut c_void, + ) + }; + let roc_dealloc_ptr: isize = unsafe { + std::mem::transmute(host::roc_dealloc as *const unsafe extern "C" fn(*mut c_void, u32)) + }; + let roc_panic_ptr: isize = unsafe { + std::mem::transmute(host::roc_panic as *const unsafe extern "C" fn(*mut c_void, u32)) + }; + let roc_memcpy_ptr: isize = unsafe { + std::mem::transmute( + host::roc_memcpy + as *const unsafe extern "C" fn(*mut c_void, *mut c_void, usize) -> *mut c_void, + ) + }; + let roc_memset_ptr: isize = unsafe { + std::mem::transmute( + host::roc_memset + as *const unsafe extern "C" fn(*mut c_void, i32, usize) -> *mut c_void, + ) + }; + // I really want to use the equivalent of std::hint::black_box, but it is expirimental. + result = result ^ roc_alloc_ptr; + result = result ^ roc_realloc_ptr; + result = result ^ roc_dealloc_ptr; + result = result ^ roc_panic_ptr; + result = result ^ roc_memcpy_ptr; + result = result ^ roc_memset_ptr; + result = result ^ roc_alloc_ptr; + result = result ^ roc_realloc_ptr; + result = result ^ roc_dealloc_ptr; + result = result ^ roc_panic_ptr; + result = result ^ roc_memcpy_ptr; + result = result ^ roc_memset_ptr; + } + std::process::exit(result as i32); +} diff --git a/linker/README.md b/linker/README.md index d65d68e14b..150eef59d3 100644 --- a/linker/README.md +++ b/linker/README.md @@ -31,7 +31,7 @@ This linker is run in 2 phases: preprocessing and surigical linking. ## TODO (In a lightly prioritized order) -- Test with an executable completely generated by Cargo (It will hopefully work out of the box like zig). +- Try to make rust hosts nicer. Currently making it expose functions is a huge pain. - Add Macho support - Honestly should be almost exactly the same code. This means we likely need to do a lot of refactoring to minimize the duplicate code. diff --git a/linker/src/lib.rs b/linker/src/lib.rs index 3fa53e1bbd..15ec09084a 100644 --- a/linker/src/lib.rs +++ b/linker/src/lib.rs @@ -28,6 +28,7 @@ use target_lexicon::Triple; use tempfile::Builder; mod metadata; +use metadata::VirtualOffset; pub const CMD_PREPROCESS: &str = "preprocess"; pub const CMD_SURGERY: &str = "surgery"; @@ -196,7 +197,6 @@ fn generate_dynamic_lib( let text_section = out_object.section_id(write::StandardSection::Text); for sym in exposed_to_host { - // TODO properly generate this list. for name in &[ format!("roc__{}_1_exposed", sym), format!("roc__{}_1_exposed_generic", sym), @@ -317,7 +317,9 @@ fn preprocess_impl( for sym in exec_obj.symbols().filter(|sym| { sym.is_definition() && sym.name().is_ok() && sym.name().unwrap().starts_with("roc_") }) { - let name = sym.name().unwrap().to_string(); + // remove potentially trailing "@version". + let name = sym.name().unwrap().split("@").next().unwrap().to_string(); + // special exceptions for memcpy and memset. if &name == "roc_memcpy" { md.roc_symbol_vaddresses @@ -368,9 +370,6 @@ fn preprocess_impl( println!("PLT File Offset: {:+x}", plt_offset); } - // TODO: it looks like we may need to support global data host relocations. - // Rust host look to be using them by default instead of the plt. - // I think this is due to first linking into a static lib and then linking to the c wrapper. let plt_relocs = (match exec_obj.dynamic_relocations() { Some(relocs) => relocs, None => { @@ -380,7 +379,7 @@ fn preprocess_impl( } }) .map(|(_, reloc)| reloc) - .filter(|reloc| reloc.kind() == RelocationKind::Elf(7)); + .filter(|reloc| matches!(reloc.kind(), RelocationKind::Elf(7))); let app_syms: Vec = exec_obj .dynamic_symbols() @@ -388,6 +387,28 @@ fn preprocess_impl( sym.is_undefined() && sym.name().is_ok() && sym.name().unwrap().starts_with("roc_") }) .collect(); + + let got_app_syms: Vec<(String, usize)> = (match exec_obj.dynamic_relocations() { + Some(relocs) => relocs, + None => { + println!("Executable never calls any application functions."); + println!("No work to do. Probably an invalid input."); + return Ok(-1); + } + }) + .map(|(_, reloc)| reloc) + .filter(|reloc| matches!(reloc.kind(), RelocationKind::Elf(6))) + .map(|reloc| { + for symbol in app_syms.iter() { + if reloc.target() == RelocationTarget::Symbol(symbol.index()) { + return Some((symbol.name().unwrap().to_string(), symbol.index().0)); + } + } + None + }) + .filter_map(|x| x) + .collect(); + for sym in app_syms.iter() { let name = sym.name().unwrap().to_string(); md.app_functions.push(name.clone()); @@ -408,6 +429,7 @@ fn preprocess_impl( if reloc.target() == RelocationTarget::Symbol(symbol.index()) { let func_address = (i as u64 + 1) * PLT_ADDRESS_OFFSET + plt_address; let func_offset = (i as u64 + 1) * PLT_ADDRESS_OFFSET + plt_offset; + println!("{}", symbol.name().unwrap().to_string()); app_func_addresses.insert(func_address, symbol.name().unwrap()); md.plt_addresses.insert( symbol.name().unwrap().to_string(), @@ -537,7 +559,7 @@ fn preprocess_impl( .unwrap() .push(metadata::SurgeryEntry { file_offset: offset, - virtual_offset: inst.next_ip(), + virtual_offset: VirtualOffset::Relative(inst.next_ip()), size: op_size, }); } @@ -879,7 +901,7 @@ fn preprocess_impl( sec_offset as usize + md.added_byte_count as usize, sec_size as usize / mem::size_of::>(), ); - for rel in relocations.iter_mut() { + for (i, rel) in relocations.iter_mut().enumerate() { let r_offset = rel.r_offset.get(NativeEndian); if virtual_shift_start <= r_offset { rel.r_offset = endian::U64::new(LittleEndian, r_offset + md.added_byte_count); @@ -891,6 +913,28 @@ fn preprocess_impl( .set(LittleEndian, r_addend + md.added_byte_count as i64); } } + // If the relocation goes to a roc function, we need to surgically link it and change it to relative. + let r_type = rel.r_type(NativeEndian, false); + if r_type == elf::R_X86_64_GLOB_DAT { + let r_sym = rel.r_sym(NativeEndian, false); + for (name, index) in got_app_syms.iter() { + if *index as u32 == r_sym { + rel.set_r_info(LittleEndian, false, 0, elf::R_X86_64_RELATIVE); + let addend_addr = sec_offset as usize + + i * mem::size_of::>() + // This 16 skips the first 2 fields and gets to the addend field. + + 16; + md.surgeries + .get_mut(name) + .unwrap() + .push(metadata::SurgeryEntry { + file_offset: addend_addr as u64, + virtual_offset: VirtualOffset::Absolute, + size: 8, + }); + } + } + } } } @@ -1462,7 +1506,7 @@ fn surgery_impl( let dynsym_offset = md.dynamic_symbol_table_section_offset + md.added_byte_count; for func_name in md.app_functions { - let virt_offset = match app_func_vaddr_map.get(&func_name) { + let func_virt_offset = match app_func_vaddr_map.get(&func_name) { Some(offset) => *offset as u64, None => { println!("Function, {}, was not defined by the app", &func_name); @@ -1472,7 +1516,7 @@ fn surgery_impl( if verbose { println!( "Updating calls to {} to the address: {:+x}", - &func_name, virt_offset + &func_name, func_virt_offset ); } @@ -1480,11 +1524,13 @@ fn surgery_impl( if verbose { println!("\tPerforming surgery: {:+x?}", s); } + let surgery_virt_offset = match s.virtual_offset { + VirtualOffset::Relative(vs) => (vs + md.added_byte_count) as i64, + VirtualOffset::Absolute => 0, + }; match s.size { 4 => { - let target = (virt_offset as i64 - - (s.virtual_offset + md.added_byte_count) as i64) - as i32; + let target = (func_virt_offset as i64 - surgery_virt_offset) as i32; if verbose { println!("\tTarget Jump: {:+x}", target); } @@ -1493,6 +1539,16 @@ fn surgery_impl( ..(s.file_offset + md.added_byte_count) as usize + 4] .copy_from_slice(&data); } + 8 => { + let target = func_virt_offset as i64 - surgery_virt_offset; + if verbose { + println!("\tTarget Jump: {:+x}", target); + } + let data = target.to_le_bytes(); + exec_mmap[(s.file_offset + md.added_byte_count) as usize + ..(s.file_offset + md.added_byte_count) as usize + 8] + .copy_from_slice(&data); + } x => { println!("Surgery size not yet supported: {}", x); return Ok(-1); @@ -1506,7 +1562,8 @@ fn surgery_impl( let plt_off = (*plt_off + md.added_byte_count) as usize; let plt_vaddr = *plt_vaddr + md.added_byte_count; let jmp_inst_len = 5; - let target = (virt_offset as i64 - (plt_vaddr as i64 + jmp_inst_len as i64)) as i32; + let target = + (func_virt_offset as i64 - (plt_vaddr as i64 + jmp_inst_len as i64)) as i32; if verbose { println!("\tPLT: {:+x}, {:+x}", plt_off, plt_vaddr); println!("\tTarget Jump: {:+x}", target); @@ -1525,7 +1582,7 @@ fn surgery_impl( dynsym_offset as usize + *i as usize * mem::size_of::>(), ); sym.st_shndx = endian::U16::new(LittleEndian, new_text_section_index as u16); - sym.st_value = endian::U64::new(LittleEndian, virt_offset as u64); + sym.st_value = endian::U64::new(LittleEndian, func_virt_offset as u64); sym.st_size = endian::U64::new( LittleEndian, match app_func_size_map.get(&func_name) { diff --git a/linker/src/metadata.rs b/linker/src/metadata.rs index 16f06232cd..f24bf9a626 100644 --- a/linker/src/metadata.rs +++ b/linker/src/metadata.rs @@ -1,10 +1,16 @@ use roc_collections::all::MutMap; use serde::{Deserialize, Serialize}; +#[derive(Serialize, Deserialize, PartialEq, Debug)] +pub enum VirtualOffset { + Absolute, + Relative(u64), +} + #[derive(Serialize, Deserialize, PartialEq, Debug)] pub struct SurgeryEntry { pub file_offset: u64, - pub virtual_offset: u64, + pub virtual_offset: VirtualOffset, pub size: u8, } diff --git a/ult = result ^ roc_memcpy_ptr b/ult = result ^ roc_memcpy_ptr new file mode 100644 index 0000000000..88b26daf7c --- /dev/null +++ b/ult = result ^ roc_memcpy_ptr @@ -0,0 +1,651 @@ + +examples/hello-rust/platform/dynhost: file format elf64-x86-64 + +DYNAMIC RELOCATION RECORDS +OFFSET TYPE VALUE +000000000003f520 R_X86_64_RELATIVE *ABS*+0x00000000000112f0 +000000000003f528 R_X86_64_RELATIVE *ABS*+0x0000000000023b70 +000000000003f530 R_X86_64_RELATIVE *ABS*+0x0000000000011330 +000000000003f538 R_X86_64_RELATIVE *ABS*+0x00000000000113f0 +000000000003f550 R_X86_64_RELATIVE *ABS*+0x00000000000113d0 +000000000003f558 R_X86_64_RELATIVE *ABS*+0x00000000000113d0 +000000000003f560 R_X86_64_RELATIVE *ABS*+0x00000000000113e0 +000000000003f568 R_X86_64_RELATIVE *ABS*+0x0000000000006a10 +000000000003f580 R_X86_64_RELATIVE *ABS*+0x0000000000011560 +000000000003f598 R_X86_64_RELATIVE *ABS*+0x00000000000115f0 +000000000003f5a0 R_X86_64_RELATIVE *ABS*+0x0000000000011650 +000000000003f5b8 R_X86_64_RELATIVE *ABS*+0x0000000000011590 +000000000003f5c0 R_X86_64_RELATIVE *ABS*+0x0000000000011570 +000000000003f5c8 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 +000000000003f5e0 R_X86_64_RELATIVE *ABS*+0x0000000000015090 +000000000003f5e8 R_X86_64_RELATIVE *ABS*+0x0000000000014f80 +000000000003f5f0 R_X86_64_RELATIVE *ABS*+0x0000000000014f90 +000000000003f5f8 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 +000000000003f610 R_X86_64_RELATIVE *ABS*+0x0000000000015080 +000000000003f618 R_X86_64_RELATIVE *ABS*+0x0000000000014ea0 +000000000003f620 R_X86_64_RELATIVE *ABS*+0x0000000000014fe0 +000000000003f628 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 +000000000003f640 R_X86_64_RELATIVE *ABS*+0x0000000000015100 +000000000003f648 R_X86_64_RELATIVE *ABS*+0x0000000000014d80 +000000000003f650 R_X86_64_RELATIVE *ABS*+0x0000000000015030 +000000000003f658 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 +000000000003f670 R_X86_64_RELATIVE *ABS*+0x0000000000011870 +000000000003f678 R_X86_64_RELATIVE *ABS*+0x0000000000007ae8 +000000000003f690 R_X86_64_RELATIVE *ABS*+0x0000000000007b99 +000000000003f6a8 R_X86_64_RELATIVE *ABS*+0x0000000000007b99 +000000000003f6c0 R_X86_64_RELATIVE *ABS*+0x0000000000007b99 +000000000003f6d8 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 +000000000003f6f0 R_X86_64_RELATIVE *ABS*+0x00000000000116d0 +000000000003f6f8 R_X86_64_RELATIVE *ABS*+0x0000000000007d00 +000000000003f710 R_X86_64_RELATIVE *ABS*+0x0000000000007d00 +000000000003f728 R_X86_64_RELATIVE *ABS*+0x0000000000007d00 +000000000003f740 R_X86_64_RELATIVE *ABS*+0x0000000000007d70 +000000000003f758 R_X86_64_RELATIVE *ABS*+0x0000000000007d70 +000000000003f770 R_X86_64_RELATIVE *ABS*+0x0000000000007d70 +000000000003f788 R_X86_64_RELATIVE *ABS*+0x0000000000007d70 +000000000003f7a0 R_X86_64_RELATIVE *ABS*+0x0000000000007d70 +000000000003f7b8 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 +000000000003f7d0 R_X86_64_RELATIVE *ABS*+0x000000000001d480 +000000000003f7d8 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 +000000000003f7f0 R_X86_64_RELATIVE *ABS*+0x00000000000391b0 +000000000003f7f8 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 +000000000003f810 R_X86_64_RELATIVE *ABS*+0x0000000000039190 +000000000003f818 R_X86_64_RELATIVE *ABS*+0x0000000000012420 +000000000003f830 R_X86_64_RELATIVE *ABS*+0x00000000000239d0 +000000000003f838 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 +000000000003f850 R_X86_64_RELATIVE *ABS*+0x000000000003e1c0 +000000000003f858 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 +000000000003f870 R_X86_64_RELATIVE *ABS*+0x0000000000011700 +000000000003f878 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 +000000000003f890 R_X86_64_RELATIVE *ABS*+0x0000000000011810 +000000000003f898 R_X86_64_RELATIVE *ABS*+0x0000000000007e14 +000000000003f8b0 R_X86_64_RELATIVE *ABS*+0x0000000000007e60 +000000000003f8c8 R_X86_64_RELATIVE *ABS*+0x0000000000007e60 +000000000003f8e0 R_X86_64_RELATIVE *ABS*+0x0000000000007e60 +000000000003f8f8 R_X86_64_RELATIVE *ABS*+0x0000000000007e60 +000000000003f910 R_X86_64_RELATIVE *ABS*+0x0000000000007e60 +000000000003f928 R_X86_64_RELATIVE *ABS*+0x0000000000007eaa +000000000003f940 R_X86_64_RELATIVE *ABS*+0x0000000000007eaa +000000000003f958 R_X86_64_RELATIVE *ABS*+0x0000000000007eaa +000000000003f970 R_X86_64_RELATIVE *ABS*+0x0000000000007eaa +000000000003f988 R_X86_64_RELATIVE *ABS*+0x0000000000007b99 +000000000003f9a0 R_X86_64_RELATIVE *ABS*+0x0000000000007f44 +000000000003f9b8 R_X86_64_RELATIVE *ABS*+0x0000000000007f44 +000000000003f9d0 R_X86_64_RELATIVE *ABS*+0x0000000000007f44 +000000000003f9e8 R_X86_64_RELATIVE *ABS*+0x0000000000007f44 +000000000003fa00 R_X86_64_RELATIVE *ABS*+0x0000000000007f44 +000000000003fa18 R_X86_64_RELATIVE *ABS*+0x0000000000007f44 +000000000003fa30 R_X86_64_RELATIVE *ABS*+0x0000000000007f44 +000000000003fa48 R_X86_64_RELATIVE *ABS*+0x0000000000007fe0 +000000000003fa60 R_X86_64_RELATIVE *ABS*+0x000000000000805d +000000000003fa78 R_X86_64_RELATIVE *ABS*+0x000000000000805d +000000000003fa90 R_X86_64_RELATIVE *ABS*+0x000000000000805d +000000000003faa8 R_X86_64_RELATIVE *ABS*+0x000000000000805d +000000000003fac0 R_X86_64_RELATIVE *ABS*+0x0000000000008184 +000000000003fad0 R_X86_64_RELATIVE *ABS*+0x00000000000081a8 +000000000003fae0 R_X86_64_RELATIVE *ABS*+0x000000000000816e +000000000003faf8 R_X86_64_RELATIVE *ABS*+0x00000000000081ab +000000000003fb08 R_X86_64_RELATIVE *ABS*+0x00000000000081cc +000000000003fb20 R_X86_64_RELATIVE *ABS*+0x00000000000081f4 +000000000003fb30 R_X86_64_RELATIVE *ABS*+0x00000000000081cc +000000000003fb48 R_X86_64_RELATIVE *ABS*+0x0000000000007ae8 +000000000003fb58 R_X86_64_RELATIVE *ABS*+0x0000000000007ae8 +000000000003fb68 R_X86_64_RELATIVE *ABS*+0x0000000000008336 +000000000003fb78 R_X86_64_RELATIVE *ABS*+0x0000000000008341 +000000000003fb88 R_X86_64_RELATIVE *ABS*+0x0000000000008342 +000000000003fb98 R_X86_64_RELATIVE *ABS*+0x000000000000835e +000000000003fbb0 R_X86_64_RELATIVE *ABS*+0x000000000000837b +000000000003fbc8 R_X86_64_RELATIVE *ABS*+0x000000000000837b +000000000003fbe0 R_X86_64_RELATIVE *ABS*+0x0000000000008394 +000000000003fbf0 R_X86_64_RELATIVE *ABS*+0x0000000000013010 +000000000003fc08 R_X86_64_RELATIVE *ABS*+0x000000000001ef40 +000000000003fc10 R_X86_64_RELATIVE *ABS*+0x0000000000011910 +000000000003fc18 R_X86_64_RELATIVE *ABS*+0x0000000000011b40 +000000000003fc20 R_X86_64_RELATIVE *ABS*+0x0000000000013010 +000000000003fc38 R_X86_64_RELATIVE *ABS*+0x000000000001eda0 +000000000003fc40 R_X86_64_RELATIVE *ABS*+0x0000000000011a20 +000000000003fc48 R_X86_64_RELATIVE *ABS*+0x0000000000011b00 +000000000003fc50 R_X86_64_RELATIVE *ABS*+0x00000000000083a5 +000000000003fc68 R_X86_64_RELATIVE *ABS*+0x00000000000083a5 +000000000003fc80 R_X86_64_RELATIVE *ABS*+0x00000000000083a5 +000000000003fc98 R_X86_64_RELATIVE *ABS*+0x00000000000083a5 +000000000003fcb0 R_X86_64_RELATIVE *ABS*+0x00000000000083a5 +000000000003fcc8 R_X86_64_RELATIVE *ABS*+0x00000000000083a5 +000000000003fce0 R_X86_64_RELATIVE *ABS*+0x00000000000083a5 +000000000003fcf8 R_X86_64_RELATIVE *ABS*+0x00000000000083a5 +000000000003fd10 R_X86_64_RELATIVE *ABS*+0x00000000000083a5 +000000000003fd28 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 +000000000003fd40 R_X86_64_RELATIVE *ABS*+0x000000000001fe50 +000000000003fd48 R_X86_64_RELATIVE *ABS*+0x0000000000011c00 +000000000003fd50 R_X86_64_RELATIVE *ABS*+0x00000000000083bc +000000000003fd68 R_X86_64_RELATIVE *ABS*+0x00000000000083bc +000000000003fd80 R_X86_64_RELATIVE *ABS*+0x00000000000083bc +000000000003fd98 R_X86_64_RELATIVE *ABS*+0x00000000000083bc +000000000003fdb0 R_X86_64_RELATIVE *ABS*+0x00000000000083bc +000000000003fdc8 R_X86_64_RELATIVE *ABS*+0x000000000000843b +000000000003fdd8 R_X86_64_RELATIVE *ABS*+0x0000000000013090 +000000000003fdf0 R_X86_64_RELATIVE *ABS*+0x00000000000207d0 +000000000003fdf8 R_X86_64_RELATIVE *ABS*+0x0000000000011b80 +000000000003fe00 R_X86_64_RELATIVE *ABS*+0x000000000000844c +000000000003fe10 R_X86_64_RELATIVE *ABS*+0x00000000000083a4 +000000000003fe20 R_X86_64_RELATIVE *ABS*+0x0000000000007ae8 +000000000003fe30 R_X86_64_RELATIVE *ABS*+0x00000000000084e3 +000000000003fe40 R_X86_64_RELATIVE *ABS*+0x0000000000008520 +000000000003fe58 R_X86_64_RELATIVE *ABS*+0x0000000000008520 +000000000003fe70 R_X86_64_RELATIVE *ABS*+0x0000000000008520 +000000000003fe88 R_X86_64_RELATIVE *ABS*+0x0000000000008520 +000000000003fea0 R_X86_64_RELATIVE *ABS*+0x0000000000008520 +000000000003feb8 R_X86_64_RELATIVE *ABS*+0x0000000000008520 +000000000003fed0 R_X86_64_RELATIVE *ABS*+0x0000000000008520 +000000000003fee8 R_X86_64_RELATIVE *ABS*+0x000000000000856f +000000000003fef8 R_X86_64_RELATIVE *ABS*+0x0000000000008584 +000000000003ff08 R_X86_64_RELATIVE *ABS*+0x0000000000008585 +000000000003ff18 R_X86_64_RELATIVE *ABS*+0x00000000000085a2 +000000000003ff28 R_X86_64_RELATIVE *ABS*+0x00000000000085b7 +000000000003ff38 R_X86_64_RELATIVE *ABS*+0x00000000000085c5 +000000000003ff48 R_X86_64_RELATIVE *ABS*+0x00000000000085e1 +000000000003ff58 R_X86_64_RELATIVE *ABS*+0x0000000000008605 +000000000003ff70 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 +000000000003ff88 R_X86_64_RELATIVE *ABS*+0x00000000000249d0 +000000000003ff90 R_X86_64_RELATIVE *ABS*+0x0000000000024a30 +000000000003ff98 R_X86_64_RELATIVE *ABS*+0x0000000000024a90 +000000000003ffa0 R_X86_64_RELATIVE *ABS*+0x0000000000024aa0 +000000000003ffa8 R_X86_64_RELATIVE *ABS*+0x000000000001e550 +000000000003ffb0 R_X86_64_RELATIVE *ABS*+0x000000000001e640 +000000000003ffb8 R_X86_64_RELATIVE *ABS*+0x000000000001ec50 +000000000003ffc8 R_X86_64_RELATIVE *ABS*+0x0000000000012190 +000000000003ffe0 R_X86_64_RELATIVE *ABS*+0x000000000001e2c0 +000000000003ffe8 R_X86_64_RELATIVE *ABS*+0x000000000001e330 +000000000003fff0 R_X86_64_RELATIVE *ABS*+0x000000000001e4c0 +000000000003fff8 R_X86_64_RELATIVE *ABS*+0x000000000001e540 +0000000000040000 R_X86_64_RELATIVE *ABS*+0x000000000001e4d0 +0000000000040008 R_X86_64_RELATIVE *ABS*+0x000000000001e890 +0000000000040010 R_X86_64_RELATIVE *ABS*+0x000000000001eb00 +0000000000040020 R_X86_64_RELATIVE *ABS*+0x0000000000008150 +0000000000040030 R_X86_64_RELATIVE *ABS*+0x0000000000008636 +0000000000040040 R_X86_64_RELATIVE *ABS*+0x0000000000008645 +0000000000040050 R_X86_64_RELATIVE *ABS*+0x0000000000008584 +0000000000040060 R_X86_64_RELATIVE *ABS*+0x0000000000008648 +0000000000040070 R_X86_64_RELATIVE *ABS*+0x0000000000008605 +0000000000040088 R_X86_64_RELATIVE *ABS*+0x0000000000008605 +00000000000400a0 R_X86_64_RELATIVE *ABS*+0x0000000000012d90 +00000000000400b8 R_X86_64_RELATIVE *ABS*+0x0000000000022690 +00000000000400c0 R_X86_64_RELATIVE *ABS*+0x0000000000022790 +00000000000400c8 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 +00000000000400e0 R_X86_64_RELATIVE *ABS*+0x0000000000022830 +00000000000400e8 R_X86_64_RELATIVE *ABS*+0x0000000000022880 +00000000000400f0 R_X86_64_RELATIVE *ABS*+0x0000000000012190 +0000000000040108 R_X86_64_RELATIVE *ABS*+0x00000000000116e0 +0000000000040110 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 +0000000000040128 R_X86_64_RELATIVE *ABS*+0x00000000000116f0 +0000000000040130 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 +0000000000040148 R_X86_64_RELATIVE *ABS*+0x00000000000228f0 +0000000000040150 R_X86_64_RELATIVE *ABS*+0x0000000000022950 +0000000000040158 R_X86_64_RELATIVE *ABS*+0x0000000000008696 +0000000000040168 R_X86_64_RELATIVE *ABS*+0x0000000000007ae8 +0000000000040178 R_X86_64_RELATIVE *ABS*+0x00000000000086c8 +0000000000040188 R_X86_64_RELATIVE *ABS*+0x00000000000086f9 +0000000000040198 R_X86_64_RELATIVE *ABS*+0x0000000000007c20 +00000000000401a8 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 +00000000000401c0 R_X86_64_RELATIVE *ABS*+0x0000000000020a40 +00000000000401c8 R_X86_64_RELATIVE *ABS*+0x0000000000011c20 +00000000000401d0 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 +00000000000401e8 R_X86_64_RELATIVE *ABS*+0x0000000000020810 +00000000000401f0 R_X86_64_RELATIVE *ABS*+0x0000000000011bf0 +00000000000401f8 R_X86_64_RELATIVE *ABS*+0x0000000000008724 +0000000000040210 R_X86_64_RELATIVE *ABS*+0x0000000000008758 +0000000000040220 R_X86_64_RELATIVE *ABS*+0x0000000000007ae8 +0000000000040230 R_X86_64_RELATIVE *ABS*+0x0000000000008379 +0000000000040240 R_X86_64_RELATIVE *ABS*+0x0000000000007ae8 +0000000000040250 R_X86_64_RELATIVE *ABS*+0x00000000000087d0 +0000000000040260 R_X86_64_RELATIVE *ABS*+0x00000000000084da +0000000000040270 R_X86_64_RELATIVE *ABS*+0x0000000000006b40 +0000000000040280 R_X86_64_RELATIVE *ABS*+0x00000000000083a3 +0000000000040290 R_X86_64_RELATIVE *ABS*+0x0000000000008584 +00000000000402a0 R_X86_64_RELATIVE *ABS*+0x00000000000087fd +00000000000402b8 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 +00000000000402d0 R_X86_64_RELATIVE *ABS*+0x0000000000011780 +00000000000402d8 R_X86_64_RELATIVE *ABS*+0x000000000000884a +00000000000402f0 R_X86_64_RELATIVE *ABS*+0x000000000000887a +0000000000040308 R_X86_64_RELATIVE *ABS*+0x000000000000887a +0000000000040320 R_X86_64_RELATIVE *ABS*+0x00000000000088a6 +0000000000040330 R_X86_64_RELATIVE *ABS*+0x0000000000008902 +0000000000040348 R_X86_64_RELATIVE *ABS*+0x0000000000008902 +0000000000040360 R_X86_64_RELATIVE *ABS*+0x000000000000894d +0000000000040370 R_X86_64_RELATIVE *ABS*+0x0000000000008956 +0000000000040380 R_X86_64_RELATIVE *ABS*+0x0000000000008971 +0000000000040390 R_X86_64_RELATIVE *ABS*+0x000000000000897f +00000000000403a0 R_X86_64_RELATIVE *ABS*+0x00000000000089a8 +00000000000403b8 R_X86_64_RELATIVE *ABS*+0x00000000000089d2 +00000000000403c8 R_X86_64_RELATIVE *ABS*+0x00000000000089a8 +00000000000403e0 R_X86_64_RELATIVE *ABS*+0x0000000000008a01 +00000000000403f8 R_X86_64_RELATIVE *ABS*+0x0000000000008a01 +0000000000040410 R_X86_64_RELATIVE *ABS*+0x0000000000008a01 +0000000000040428 R_X86_64_RELATIVE *ABS*+0x0000000000008a23 +0000000000040440 R_X86_64_RELATIVE *ABS*+0x0000000000008a96 +0000000000040458 R_X86_64_RELATIVE *ABS*+0x0000000000008abb +0000000000040470 R_X86_64_RELATIVE *ABS*+0x0000000000008af7 +0000000000040488 R_X86_64_RELATIVE *ABS*+0x0000000000008af7 +00000000000404a0 R_X86_64_RELATIVE *ABS*+0x0000000000008b2d +00000000000404b8 R_X86_64_RELATIVE *ABS*+0x000000000002d900 +00000000000404d0 R_X86_64_RELATIVE *ABS*+0x000000000002dbc0 +00000000000404d8 R_X86_64_RELATIVE *ABS*+0x000000000002dbc0 +00000000000404e0 R_X86_64_RELATIVE *ABS*+0x000000000002d880 +00000000000404e8 R_X86_64_RELATIVE *ABS*+0x000000000002d900 +0000000000040500 R_X86_64_RELATIVE *ABS*+0x000000000002dbd0 +0000000000040508 R_X86_64_RELATIVE *ABS*+0x000000000002dbd0 +0000000000040510 R_X86_64_RELATIVE *ABS*+0x000000000002d870 +0000000000040518 R_X86_64_RELATIVE *ABS*+0x0000000000008c57 +0000000000040530 R_X86_64_RELATIVE *ABS*+0x0000000000008c57 +0000000000040548 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040560 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040578 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040590 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +00000000000405a8 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +00000000000405c0 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +00000000000405d8 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +00000000000405f0 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040608 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040620 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040638 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040650 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040668 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040680 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040698 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +00000000000406b0 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +00000000000406c8 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +00000000000406e0 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +00000000000406f8 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040710 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040728 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040740 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040758 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040770 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040788 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +00000000000407a0 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +00000000000407b8 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +00000000000407d0 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +00000000000407e8 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040800 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040818 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040830 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040848 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040860 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040878 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040890 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +00000000000408a8 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +00000000000408c0 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +00000000000408d8 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +00000000000408f0 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040908 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040920 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040938 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040950 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040968 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040980 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040998 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +00000000000409b0 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +00000000000409c8 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +00000000000409e0 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +00000000000409f8 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040a10 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 +0000000000040a28 R_X86_64_RELATIVE *ABS*+0x0000000000008d92 +0000000000040a40 R_X86_64_RELATIVE *ABS*+0x0000000000008d92 +0000000000040a58 R_X86_64_RELATIVE *ABS*+0x00000000000315f0 +0000000000040a70 R_X86_64_RELATIVE *ABS*+0x0000000000031590 +0000000000040a78 R_X86_64_RELATIVE *ABS*+0x000000000000904b +0000000000040a90 R_X86_64_RELATIVE *ABS*+0x00000000000090db +0000000000040aa8 R_X86_64_RELATIVE *ABS*+0x00000000000090db +0000000000040ac0 R_X86_64_RELATIVE *ABS*+0x00000000000090db +0000000000040ad8 R_X86_64_RELATIVE *ABS*+0x00000000000090db +0000000000040af0 R_X86_64_RELATIVE *ABS*+0x00000000000090db +0000000000040b08 R_X86_64_RELATIVE *ABS*+0x0000000000009260 +0000000000040b20 R_X86_64_RELATIVE *ABS*+0x0000000000009260 +0000000000040b38 R_X86_64_RELATIVE *ABS*+0x0000000000009260 +0000000000040b50 R_X86_64_RELATIVE *ABS*+0x000000000000960e +0000000000040b68 R_X86_64_RELATIVE *ABS*+0x000000000000960e +0000000000040b80 R_X86_64_RELATIVE *ABS*+0x000000000000960e +0000000000040b98 R_X86_64_RELATIVE *ABS*+0x00000000000331f0 +0000000000040bb0 R_X86_64_RELATIVE *ABS*+0x000000000003d290 +0000000000040bb8 R_X86_64_RELATIVE *ABS*+0x000000000000960e +0000000000040bd0 R_X86_64_RELATIVE *ABS*+0x000000000000960e +0000000000040be8 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 +0000000000040c00 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 +0000000000040c18 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 +0000000000040c30 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 +0000000000040c48 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 +0000000000040c60 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 +0000000000040c78 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 +0000000000040c90 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 +0000000000040ca8 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 +0000000000040cc0 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 +0000000000040cd8 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 +0000000000040cf0 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 +0000000000040d08 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 +0000000000040d20 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 +0000000000040d38 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 +0000000000040d50 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 +0000000000040d68 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 +0000000000040d80 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 +0000000000040d98 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 +0000000000040db0 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 +0000000000040dc8 R_X86_64_RELATIVE *ABS*+0x0000000000009712 +0000000000040de0 R_X86_64_RELATIVE *ABS*+0x0000000000009712 +0000000000040df8 R_X86_64_RELATIVE *ABS*+0x0000000000009712 +0000000000040e10 R_X86_64_RELATIVE *ABS*+0x0000000000009712 +0000000000040e28 R_X86_64_RELATIVE *ABS*+0x0000000000009712 +0000000000040e40 R_X86_64_RELATIVE *ABS*+0x0000000000009712 +0000000000040e58 R_X86_64_RELATIVE *ABS*+0x0000000000009712 +0000000000040e70 R_X86_64_RELATIVE *ABS*+0x0000000000009712 +0000000000040e88 R_X86_64_RELATIVE *ABS*+0x0000000000009712 +0000000000040ea0 R_X86_64_RELATIVE *ABS*+0x0000000000009712 +0000000000040eb8 R_X86_64_RELATIVE *ABS*+0x0000000000009712 +0000000000040ed0 R_X86_64_RELATIVE *ABS*+0x0000000000009712 +0000000000040ee8 R_X86_64_RELATIVE *ABS*+0x0000000000009712 +0000000000040f00 R_X86_64_RELATIVE *ABS*+0x0000000000009712 +0000000000040f18 R_X86_64_RELATIVE *ABS*+0x000000000000979a +0000000000040f28 R_X86_64_RELATIVE *ABS*+0x00000000000097d8 +0000000000040f40 R_X86_64_RELATIVE *ABS*+0x00000000000097d8 +0000000000040f58 R_X86_64_RELATIVE *ABS*+0x0000000000009828 +0000000000040f70 R_X86_64_RELATIVE *ABS*+0x0000000000009939 +0000000000040f80 R_X86_64_RELATIVE *ABS*+0x0000000000009975 +0000000000040f98 R_X86_64_RELATIVE *ABS*+0x0000000000009990 +0000000000040fa8 R_X86_64_RELATIVE *ABS*+0x0000000000009938 +0000000000040fb8 R_X86_64_RELATIVE *ABS*+0x0000000000038f70 +0000000000040fd0 R_X86_64_RELATIVE *ABS*+0x0000000000039180 +0000000000040fd8 R_X86_64_RELATIVE *ABS*+0x00000000000099e2 +0000000000040fe8 R_X86_64_RELATIVE *ABS*+0x00000000000099e3 +0000000000040ff8 R_X86_64_RELATIVE *ABS*+0x0000000000009938 +0000000000041008 R_X86_64_RELATIVE *ABS*+0x00000000000099e6 +0000000000041018 R_X86_64_RELATIVE *ABS*+0x00000000000099e6 +0000000000041028 R_X86_64_RELATIVE *ABS*+0x0000000000007c80 +0000000000041038 R_X86_64_RELATIVE *ABS*+0x00000000000099e7 +0000000000041048 R_X86_64_RELATIVE *ABS*+0x0000000000009a04 +0000000000041058 R_X86_64_RELATIVE *ABS*+0x0000000000009a1d +0000000000041068 R_X86_64_RELATIVE *ABS*+0x0000000000009a2f +0000000000041078 R_X86_64_RELATIVE *ABS*+0x0000000000009a3b +0000000000041088 R_X86_64_RELATIVE *ABS*+0x0000000000009a04 +0000000000041098 R_X86_64_RELATIVE *ABS*+0x0000000000009a1d +00000000000410a8 R_X86_64_RELATIVE *ABS*+0x0000000000009a2f +00000000000410b8 R_X86_64_RELATIVE *ABS*+0x0000000000009a3e +00000000000410c8 R_X86_64_RELATIVE *ABS*+0x0000000000009938 +00000000000410d8 R_X86_64_RELATIVE *ABS*+0x0000000000009a3f +00000000000410e8 R_X86_64_RELATIVE *ABS*+0x0000000000038f70 +0000000000041100 R_X86_64_RELATIVE *ABS*+0x0000000000039880 +0000000000041108 R_X86_64_RELATIVE *ABS*+0x000000000003a060 +0000000000041110 R_X86_64_RELATIVE *ABS*+0x000000000003a140 +0000000000041118 R_X86_64_RELATIVE *ABS*+0x0000000000007ce0 +0000000000041130 R_X86_64_RELATIVE *ABS*+0x0000000000007ce0 +0000000000041148 R_X86_64_RELATIVE *ABS*+0x0000000000038f70 +0000000000041160 R_X86_64_RELATIVE *ABS*+0x000000000003deb0 +0000000000041168 R_X86_64_RELATIVE *ABS*+0x0000000000009a56 +0000000000041180 R_X86_64_RELATIVE *ABS*+0x0000000000038f70 +0000000000041198 R_X86_64_RELATIVE *ABS*+0x000000000003a180 +00000000000411a0 R_X86_64_RELATIVE *ABS*+0x000000000003a190 +00000000000411a8 R_X86_64_RELATIVE *ABS*+0x000000000003a270 +00000000000411b0 R_X86_64_RELATIVE *ABS*+0x0000000000007c60 +00000000000411c8 R_X86_64_RELATIVE *ABS*+0x0000000000009b3b +00000000000411d8 R_X86_64_RELATIVE *ABS*+0x0000000000009b4d +00000000000411e8 R_X86_64_RELATIVE *ABS*+0x0000000000006c30 +00000000000411f8 R_X86_64_RELATIVE *ABS*+0x0000000000009b4d +0000000000041208 R_X86_64_RELATIVE *ABS*+0x0000000000009b6f +0000000000041218 R_X86_64_RELATIVE *ABS*+0x0000000000009b85 +0000000000041228 R_X86_64_RELATIVE *ABS*+0x0000000000009b92 +0000000000041238 R_X86_64_RELATIVE *ABS*+0x0000000000009ba7 +0000000000041248 R_X86_64_RELATIVE *ABS*+0x0000000000009a52 +0000000000041258 R_X86_64_RELATIVE *ABS*+0x0000000000009bfc +0000000000041270 R_X86_64_RELATIVE *ABS*+0x0000000000009d1f +0000000000041288 R_X86_64_RELATIVE *ABS*+0x0000000000009d1f +00000000000412a0 R_X86_64_RELATIVE *ABS*+0x0000000000009d1f +00000000000412b8 R_X86_64_RELATIVE *ABS*+0x0000000000009d1f +00000000000412d0 R_X86_64_RELATIVE *ABS*+0x0000000000009d1f +00000000000412e8 R_X86_64_RELATIVE *ABS*+0x0000000000009d1f +0000000000041300 R_X86_64_RELATIVE *ABS*+0x0000000000009d3e +0000000000041318 R_X86_64_RELATIVE *ABS*+0x0000000000009d3e +0000000000041330 R_X86_64_RELATIVE *ABS*+0x0000000000009d3e +0000000000041348 R_X86_64_RELATIVE *ABS*+0x0000000000009d3e +0000000000041360 R_X86_64_RELATIVE *ABS*+0x0000000000009d3e +0000000000041378 R_X86_64_RELATIVE *ABS*+0x0000000000009d3e +0000000000041390 R_X86_64_RELATIVE *ABS*+0x0000000000009d3e +00000000000413a8 R_X86_64_RELATIVE *ABS*+0x0000000000009d3e +00000000000413c0 R_X86_64_RELATIVE *ABS*+0x0000000000009d83 +00000000000413d0 R_X86_64_RELATIVE *ABS*+0x0000000000009d8e +00000000000413e0 R_X86_64_RELATIVE *ABS*+0x0000000000009a3e +00000000000413f0 R_X86_64_RELATIVE *ABS*+0x0000000000009da4 +0000000000041400 R_X86_64_RELATIVE *ABS*+0x0000000000007f18 +0000000000041410 R_X86_64_RELATIVE *ABS*+0x0000000000006b50 +0000000000041420 R_X86_64_RELATIVE *ABS*+0x0000000000009a3e +0000000000041430 R_X86_64_RELATIVE *ABS*+0x0000000000009d83 +0000000000041440 R_X86_64_RELATIVE *ABS*+0x0000000000009db2 +0000000000041450 R_X86_64_RELATIVE *ABS*+0x0000000000008120 +0000000000041460 R_X86_64_RELATIVE *ABS*+0x0000000000009dd8 +0000000000041470 R_X86_64_RELATIVE *ABS*+0x0000000000009a3e +0000000000041480 R_X86_64_RELATIVE *ABS*+0x0000000000009dde +0000000000041498 R_X86_64_RELATIVE *ABS*+0x0000000000009dde +00000000000414b0 R_X86_64_RELATIVE *ABS*+0x000000000000a34a +00000000000414c8 R_X86_64_RELATIVE *ABS*+0x000000000000a34a +00000000000414e0 R_X86_64_RELATIVE *ABS*+0x000000000000a34a +00000000000414f8 R_X86_64_RELATIVE *ABS*+0x0000000000038f70 +0000000000041510 R_X86_64_RELATIVE *ABS*+0x000000000003e130 +0000000000041518 R_X86_64_RELATIVE *ABS*+0x0000000000038f70 +0000000000041530 R_X86_64_RELATIVE *ABS*+0x000000000003de00 +0000000000041538 R_X86_64_RELATIVE *ABS*+0x0000000000038f70 +0000000000041550 R_X86_64_RELATIVE *ABS*+0x000000000003e030 +0000000000041780 R_X86_64_RELATIVE *ABS*+0x00000000000114b0 +0000000000041788 R_X86_64_RELATIVE *ABS*+0x0000000000011470 +0000000000041790 R_X86_64_RELATIVE *ABS*+0x0000000000011460 +0000000000041798 R_X86_64_RELATIVE *ABS*+0x0000000000011490 +00000000000417a0 R_X86_64_RELATIVE *ABS*+0x0000000000011480 +00000000000417a8 R_X86_64_RELATIVE *ABS*+0x00000000000114a0 +00000000000417b0 R_X86_64_RELATIVE *ABS*+0x000000000001fe20 +00000000000417b8 R_X86_64_RELATIVE *ABS*+0x0000000000022dc0 +00000000000417c0 R_X86_64_RELATIVE *ABS*+0x0000000000011690 +00000000000417f8 R_X86_64_RELATIVE *ABS*+0x0000000000011660 +0000000000041800 R_X86_64_RELATIVE *ABS*+0x0000000000011680 +0000000000041810 R_X86_64_RELATIVE *ABS*+0x0000000000039480 +0000000000041818 R_X86_64_RELATIVE *ABS*+0x000000000001fe40 +0000000000041820 R_X86_64_RELATIVE *ABS*+0x0000000000011400 +0000000000041828 R_X86_64_RELATIVE *ABS*+0x0000000000038ad0 +0000000000041830 R_X86_64_RELATIVE *ABS*+0x0000000000022970 +0000000000041838 R_X86_64_RELATIVE *ABS*+0x000000000003b1c0 +0000000000041840 R_X86_64_RELATIVE *ABS*+0x000000000003d660 +0000000000041848 R_X86_64_RELATIVE *ABS*+0x000000000003b1d0 +0000000000041850 R_X86_64_RELATIVE *ABS*+0x000000000003d700 +0000000000041858 R_X86_64_RELATIVE *ABS*+0x000000000003dcd0 +0000000000041860 R_X86_64_RELATIVE *ABS*+0x0000000000020d80 +0000000000041868 R_X86_64_RELATIVE *ABS*+0x000000000003b240 +0000000000041870 R_X86_64_RELATIVE *ABS*+0x000000000003a020 +0000000000041878 R_X86_64_RELATIVE *ABS*+0x000000000003a030 +0000000000041880 R_X86_64_RELATIVE *ABS*+0x000000000003d520 +0000000000041888 R_X86_64_RELATIVE *ABS*+0x000000000003d5c0 +0000000000041890 R_X86_64_RELATIVE *ABS*+0x000000000003da60 +0000000000041898 R_X86_64_RELATIVE *ABS*+0x000000000003d3e0 +00000000000418a0 R_X86_64_RELATIVE *ABS*+0x000000000003d480 +00000000000418a8 R_X86_64_RELATIVE *ABS*+0x000000000003d9d0 +00000000000418b0 R_X86_64_RELATIVE *ABS*+0x0000000000039490 +00000000000418b8 R_X86_64_RELATIVE *ABS*+0x000000000003b290 +00000000000418c0 R_X86_64_RELATIVE *ABS*+0x000000000003a310 +00000000000418c8 R_X86_64_RELATIVE *ABS*+0x0000000000011410 +00000000000418e0 R_X86_64_RELATIVE *ABS*+0x0000000000042f78 +00000000000418e8 R_X86_64_RELATIVE *ABS*+0x0000000000022450 +00000000000418f0 R_X86_64_RELATIVE *ABS*+0x00000000000204c0 +0000000000041910 R_X86_64_RELATIVE *ABS*+0x000000000003b8d0 +0000000000041918 R_X86_64_RELATIVE *ABS*+0x000000000003bcd0 +0000000000041920 R_X86_64_RELATIVE *ABS*+0x0000000000039570 +0000000000041928 R_X86_64_RELATIVE *ABS*+0x000000000003cb90 +0000000000041930 R_X86_64_RELATIVE *ABS*+0x000000000003b850 +0000000000041938 R_X86_64_RELATIVE *ABS*+0x000000000003b950 +0000000000041940 R_X86_64_RELATIVE *ABS*+0x0000000000039520 +0000000000041948 R_X86_64_RELATIVE *ABS*+0x0000000000039630 +0000000000041950 R_X86_64_RELATIVE *ABS*+0x000000000003b1b0 +0000000000041960 R_X86_64_RELATIVE *ABS*+0x0000000000011420 +0000000000041968 R_X86_64_RELATIVE *ABS*+0x0000000000038c90 +0000000000041970 R_X86_64_RELATIVE *ABS*+0x00000000000331c0 +0000000000041978 R_X86_64_RELATIVE *ABS*+0x0000000000033190 +0000000000041980 R_X86_64_RELATIVE *ABS*+0x0000000000038cb0 +0000000000041988 R_X86_64_RELATIVE *ABS*+0x0000000000031480 +0000000000041990 R_X86_64_RELATIVE *ABS*+0x0000000000033150 +0000000000041998 R_X86_64_RELATIVE *ABS*+0x000000000003b1e0 +00000000000419a0 R_X86_64_RELATIVE *ABS*+0x0000000000039ce0 +00000000000419a8 R_X86_64_RELATIVE *ABS*+0x0000000000024ab0 +00000000000419b0 R_X86_64_RELATIVE *ABS*+0x0000000000038f30 +00000000000419c0 R_X86_64_RELATIVE *ABS*+0x000000000001da50 +00000000000419d0 R_X86_64_RELATIVE *ABS*+0x00000000000397f0 +00000000000419f0 R_X86_64_RELATIVE *ABS*+0x0000000000024bf0 +00000000000419f8 R_X86_64_RELATIVE *ABS*+0x000000000003b170 +0000000000041a08 R_X86_64_RELATIVE *ABS*+0x000000000001f5a0 +0000000000041a10 R_X86_64_RELATIVE *ABS*+0x000000000001efb0 +0000000000041a38 R_X86_64_RELATIVE *ABS*+0x0000000000039280 +0000000000041a40 R_X86_64_RELATIVE *ABS*+0x000000000001d870 +0000000000041a50 R_X86_64_RELATIVE *ABS*+0x0000000000038a00 +0000000000041a58 R_X86_64_RELATIVE *ABS*+0x000000000003ba50 +0000000000041a68 R_X86_64_RELATIVE *ABS*+0x000000000003c600 +0000000000041a70 R_X86_64_RELATIVE *ABS*+0x000000000003ca80 +0000000000041a78 R_X86_64_RELATIVE *ABS*+0x000000000001fb70 +0000000000041a80 R_X86_64_RELATIVE *ABS*+0x000000000003b650 +0000000000041a88 R_X86_64_RELATIVE *ABS*+0x000000000003b150 +0000000000041a90 R_X86_64_RELATIVE *ABS*+0x000000000003c610 +0000000000041a98 R_X86_64_RELATIVE *ABS*+0x000000000003c620 +0000000000041aa0 R_X86_64_RELATIVE *ABS*+0x00000000000391d0 +0000000000041aa8 R_X86_64_RELATIVE *ABS*+0x000000000003b270 +0000000000041ab0 R_X86_64_RELATIVE *ABS*+0x000000000003e2c0 +0000000000041ab8 R_X86_64_RELATIVE *ABS*+0x000000000003d000 +0000000000041ac0 R_X86_64_RELATIVE *ABS*+0x0000000000020010 +0000000000041ac8 R_X86_64_RELATIVE *ABS*+0x000000000001d6c0 +0000000000041ad8 R_X86_64_RELATIVE *ABS*+0x0000000000021630 +0000000000041af8 R_X86_64_RELATIVE *ABS*+0x000000000003a2d0 +0000000000041b10 R_X86_64_RELATIVE *ABS*+0x0000000000039310 +0000000000041b18 R_X86_64_RELATIVE *ABS*+0x00000000000392f0 +0000000000041b20 R_X86_64_RELATIVE *ABS*+0x000000000001e000 +0000000000041b28 R_X86_64_RELATIVE *ABS*+0x0000000000022550 +0000000000041b30 R_X86_64_RELATIVE *ABS*+0x00000000000205c0 +0000000000041b38 R_X86_64_RELATIVE *ABS*+0x000000000002dad0 +0000000000041b40 R_X86_64_RELATIVE *ABS*+0x0000000000022590 +0000000000041b48 R_X86_64_RELATIVE *ABS*+0x0000000000039300 +0000000000041b58 R_X86_64_RELATIVE *ABS*+0x0000000000039320 +0000000000041b60 R_X86_64_RELATIVE *ABS*+0x0000000000022cd0 +0000000000041b68 R_X86_64_RELATIVE *ABS*+0x000000000002db20 +0000000000041b70 R_X86_64_RELATIVE *ABS*+0x000000000003dba0 +0000000000041bc0 R_X86_64_RELATIVE *ABS*+0x00000000000212f0 +0000000000041bc8 R_X86_64_RELATIVE *ABS*+0x00000000000224b0 +0000000000041bd0 R_X86_64_RELATIVE *ABS*+0x00000000000389a0 +0000000000041bd8 R_X86_64_RELATIVE *ABS*+0x000000000003a2c0 +0000000000041be0 R_X86_64_RELATIVE *ABS*+0x0000000000024f90 +0000000000041be8 R_X86_64_RELATIVE *ABS*+0x000000000003b200 +0000000000041bf0 R_X86_64_RELATIVE *ABS*+0x0000000000039d30 +0000000000041bf8 R_X86_64_RELATIVE *ABS*+0x0000000000039e80 +0000000000041c50 R_X86_64_RELATIVE *ABS*+0x0000000000038a10 +0000000000041c58 R_X86_64_RELATIVE *ABS*+0x0000000000011430 +0000000000041c68 R_X86_64_RELATIVE *ABS*+0x000000000001db70 +0000000000041c70 R_X86_64_RELATIVE *ABS*+0x000000000003e4a0 +0000000000041c78 R_X86_64_RELATIVE *ABS*+0x0000000000031310 +0000000000041c80 R_X86_64_RELATIVE *ABS*+0x0000000000031300 +0000000000041c88 R_X86_64_RELATIVE *ABS*+0x0000000000031990 +0000000000041c90 R_X86_64_RELATIVE *ABS*+0x0000000000031aa0 +0000000000041c98 R_X86_64_RELATIVE *ABS*+0x0000000000032fc0 +0000000000041ca0 R_X86_64_RELATIVE *ABS*+0x0000000000032fe0 +0000000000041ca8 R_X86_64_RELATIVE *ABS*+0x0000000000032f30 +0000000000041cb0 R_X86_64_RELATIVE *ABS*+0x0000000000031ae0 +0000000000041cb8 R_X86_64_RELATIVE *ABS*+0x000000000002ded0 +0000000000041cc0 R_X86_64_RELATIVE *ABS*+0x000000000002ea40 +0000000000041cc8 R_X86_64_RELATIVE *ABS*+0x0000000000023d10 +0000000000041ce8 R_X86_64_RELATIVE *ABS*+0x0000000000021ab0 +0000000000041cf8 R_X86_64_RELATIVE *ABS*+0x0000000000021a00 +0000000000041d28 R_X86_64_RELATIVE *ABS*+0x0000000000030e90 +0000000000041d30 R_X86_64_RELATIVE *ABS*+0x000000000003b9d0 +0000000000041d38 R_X86_64_RELATIVE *ABS*+0x000000000003d660 +0000000000041d40 R_X86_64_RELATIVE *ABS*+0x000000000003d700 +0000000000041d48 R_X86_64_RELATIVE *ABS*+0x000000000003dcd0 +0000000000041d50 R_X86_64_RELATIVE *ABS*+0x0000000000038af0 +0000000000041d58 R_X86_64_RELATIVE *ABS*+0x000000000003b730 +0000000000041d60 R_X86_64_RELATIVE *ABS*+0x000000000003d350 +0000000000041d68 R_X86_64_RELATIVE *ABS*+0x000000000003d340 +0000000000041d70 R_X86_64_RELATIVE *ABS*+0x000000000003e2a0 +0000000000041d78 R_X86_64_RELATIVE *ABS*+0x000000000003bcb0 +0000000000041d80 R_X86_64_RELATIVE *ABS*+0x0000000000034040 +0000000000041d88 R_X86_64_RELATIVE *ABS*+0x000000000003b2b0 +0000000000041d90 R_X86_64_RELATIVE *ABS*+0x0000000000037c40 +0000000000041d98 R_X86_64_RELATIVE *ABS*+0x0000000000033440 +0000000000041da0 R_X86_64_RELATIVE *ABS*+0x0000000000011440 +0000000000041da8 R_X86_64_RELATIVE *ABS*+0x0000000000021860 +0000000000041db0 R_X86_64_RELATIVE *ABS*+0x00000000000395f0 +0000000000041db8 R_X86_64_RELATIVE *ABS*+0x0000000000039880 +0000000000041dc0 R_X86_64_RELATIVE *ABS*+0x000000000003aaa0 +0000000000041dc8 R_X86_64_RELATIVE *ABS*+0x0000000000039b30 +0000000000041dd0 R_X86_64_RELATIVE *ABS*+0x000000000003a530 +0000000000042e08 R_X86_64_RELATIVE *ABS*+0x0000000000042e08 +0000000000042e10 R_X86_64_RELATIVE *ABS*+0x000000000002dbe0 +0000000000042e28 R_X86_64_RELATIVE *ABS*+0x00000000000214f0 +0000000000042e38 R_X86_64_RELATIVE *ABS*+0x0000000000042e08 +0000000000042e40 R_X86_64_RELATIVE *ABS*+0x0000000000008ab5 +0000000000041758 R_X86_64_GLOB_DAT __libc_start_main@GLIBC_2.2.5 +0000000000041760 R_X86_64_GLOB_DAT __gmon_start__@Base +0000000000041768 R_X86_64_GLOB_DAT _ITM_deregisterTMCloneTable@Base +0000000000041770 R_X86_64_GLOB_DAT _ITM_registerTMCloneTable@Base +0000000000041778 R_X86_64_GLOB_DAT __cxa_finalize@GLIBC_2.2.5 +00000000000417d8 R_X86_64_GLOB_DAT free@GLIBC_2.2.5 +00000000000417c8 R_X86_64_GLOB_DAT malloc@GLIBC_2.2.5 +00000000000417e0 R_X86_64_GLOB_DAT memcpy@GLIBC_2.14 +00000000000417e8 R_X86_64_GLOB_DAT memset@GLIBC_2.2.5 +00000000000417d0 R_X86_64_GLOB_DAT realloc@GLIBC_2.2.5 +00000000000417f0 R_X86_64_GLOB_DAT roc__mainForHost_1_exposed@Base +0000000000041808 R_X86_64_GLOB_DAT write@GLIBC_2.2.5 +0000000000041c00 R_X86_64_GLOB_DAT bcmp@GLIBC_2.2.5 +0000000000041a48 R_X86_64_GLOB_DAT _Unwind_Backtrace@GCC_3.3 +0000000000041a60 R_X86_64_GLOB_DAT _Unwind_GetIP@GCC_3.0 +0000000000041c48 R_X86_64_GLOB_DAT __cxa_thread_atexit_impl@GLIBC_2.18 +00000000000419e8 R_X86_64_GLOB_DAT __errno_location@GLIBC_2.2.5 +0000000000041c20 R_X86_64_GLOB_DAT __xpg_strerror_r@GLIBC_2.3.4 +0000000000041b80 R_X86_64_GLOB_DAT abort@GLIBC_2.2.5 +0000000000041b08 R_X86_64_GLOB_DAT calloc@GLIBC_2.2.5 +00000000000418d8 R_X86_64_GLOB_DAT close@GLIBC_2.2.5 +0000000000041c60 R_X86_64_GLOB_DAT dl_iterate_phdr@GLIBC_2.2.5 +0000000000041c08 R_X86_64_GLOB_DAT dlsym@GLIBC_2.2.5 +0000000000041c30 R_X86_64_GLOB_DAT exit@GLIBC_2.2.5 +00000000000419d8 R_X86_64_GLOB_DAT getcwd@GLIBC_2.2.5 +0000000000041c28 R_X86_64_GLOB_DAT getenv@GLIBC_2.2.5 +00000000000419b8 R_X86_64_GLOB_DAT memchr@GLIBC_2.2.5 +0000000000041908 R_X86_64_GLOB_DAT memmove@GLIBC_2.2.5 +0000000000041c38 R_X86_64_GLOB_DAT mmap@GLIBC_2.2.5 +0000000000041c40 R_X86_64_GLOB_DAT mprotect@GLIBC_2.2.5 +00000000000418f8 R_X86_64_GLOB_DAT munmap@GLIBC_2.2.5 +0000000000041b88 R_X86_64_GLOB_DAT open@GLIBC_2.2.5 +0000000000041c10 R_X86_64_GLOB_DAT open64@GLIBC_2.2.5 +0000000000041b78 R_X86_64_GLOB_DAT poll@GLIBC_2.2.5 +0000000000041b00 R_X86_64_GLOB_DAT posix_memalign@GLIBC_2.2.5 +0000000000041bb8 R_X86_64_GLOB_DAT pthread_attr_destroy@GLIBC_2.2.5 +0000000000041bb0 R_X86_64_GLOB_DAT pthread_attr_getstack@GLIBC_2.2.5 +0000000000041ba8 R_X86_64_GLOB_DAT pthread_getattr_np@GLIBC_2.2.5 +0000000000041ae0 R_X86_64_GLOB_DAT pthread_getspecific@GLIBC_2.2.5 +0000000000041ae8 R_X86_64_GLOB_DAT pthread_key_create@GLIBC_2.2.5 +0000000000041af0 R_X86_64_GLOB_DAT pthread_key_delete@GLIBC_2.2.5 +0000000000041958 R_X86_64_GLOB_DAT pthread_mutex_destroy@GLIBC_2.2.5 +00000000000419c8 R_X86_64_GLOB_DAT pthread_mutex_lock@GLIBC_2.2.5 +0000000000041a18 R_X86_64_GLOB_DAT pthread_mutex_trylock@GLIBC_2.2.5 +00000000000418d0 R_X86_64_GLOB_DAT pthread_mutex_unlock@GLIBC_2.2.5 +0000000000041b50 R_X86_64_GLOB_DAT pthread_rwlock_rdlock@GLIBC_2.2.5 +0000000000041900 R_X86_64_GLOB_DAT pthread_rwlock_unlock@GLIBC_2.2.5 +0000000000041ba0 R_X86_64_GLOB_DAT pthread_self@GLIBC_2.2.5 +0000000000041ad0 R_X86_64_GLOB_DAT pthread_setspecific@GLIBC_2.2.5 +0000000000041c18 R_X86_64_GLOB_DAT readlink@GLIBC_2.2.5 +0000000000041b98 R_X86_64_GLOB_DAT sigaction@GLIBC_2.2.5 +0000000000041a20 R_X86_64_GLOB_DAT sigaltstack@GLIBC_2.2.5 +0000000000041b90 R_X86_64_GLOB_DAT signal@GLIBC_2.2.5 +00000000000419e0 R_X86_64_GLOB_DAT strlen@GLIBC_2.2.5 +0000000000041a30 R_X86_64_GLOB_DAT syscall@GLIBC_2.2.5 +0000000000041a28 R_X86_64_GLOB_DAT sysconf@GLIBC_2.2.5 +0000000000041a00 R_X86_64_GLOB_DAT writev@GLIBC_2.2.5 +0000000000041ce0 R_X86_64_GLOB_DAT _Unwind_DeleteException@GCC_3.0 +0000000000041cd0 R_X86_64_GLOB_DAT _Unwind_GetDataRelBase@GCC_3.0 +0000000000041d08 R_X86_64_GLOB_DAT _Unwind_GetIPInfo@GCC_4.2.0 +0000000000041d00 R_X86_64_GLOB_DAT _Unwind_GetLanguageSpecificData@GCC_3.0 +0000000000041d10 R_X86_64_GLOB_DAT _Unwind_GetRegionStart@GCC_3.0 +0000000000041cd8 R_X86_64_GLOB_DAT _Unwind_GetTextRelBase@GCC_3.0 +0000000000041cf0 R_X86_64_GLOB_DAT _Unwind_RaiseException@GCC_3.0 +0000000000041d18 R_X86_64_GLOB_DAT _Unwind_SetGR@GCC_3.0 +0000000000041d20 R_X86_64_GLOB_DAT _Unwind_SetIP@GCC_3.0 +0000000000041df0 R_X86_64_JUMP_SLOT __cxa_finalize@GLIBC_2.2.5 +0000000000041df8 R_X86_64_JUMP_SLOT _Unwind_Resume@GCC_3.0 +0000000000041e00 R_X86_64_JUMP_SLOT __fxstat64@GLIBC_2.2.5 + + From d4c32df97d2611291be4cc7b48cb2f788fc8e85c Mon Sep 17 00:00:00 2001 From: Brendan Hansknecht Date: Fri, 24 Sep 2021 22:00:58 -0700 Subject: [PATCH 3/5] Sate clippy and fix accidental garbage file --- .gitignore | 1 + linker/src/lib.rs | 5 +- ult = result ^ roc_memcpy_ptr | 651 ---------------------------------- 3 files changed, 3 insertions(+), 654 deletions(-) delete mode 100644 ult = result ^ roc_memcpy_ptr diff --git a/.gitignore b/.gitignore index 1c7ea24a83..33679f024a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ zig-cache .direnv *.rs.bk *.o +*.tmp # llvm human-readable output *.ll diff --git a/linker/src/lib.rs b/linker/src/lib.rs index 15ec09084a..be4aa891c9 100644 --- a/linker/src/lib.rs +++ b/linker/src/lib.rs @@ -318,7 +318,7 @@ fn preprocess_impl( sym.is_definition() && sym.name().is_ok() && sym.name().unwrap().starts_with("roc_") }) { // remove potentially trailing "@version". - let name = sym.name().unwrap().split("@").next().unwrap().to_string(); + let name = sym.name().unwrap().split('@').next().unwrap().to_string(); // special exceptions for memcpy and memset. if &name == "roc_memcpy" { @@ -406,7 +406,7 @@ fn preprocess_impl( } None }) - .filter_map(|x| x) + .flatten() .collect(); for sym in app_syms.iter() { @@ -429,7 +429,6 @@ fn preprocess_impl( if reloc.target() == RelocationTarget::Symbol(symbol.index()) { let func_address = (i as u64 + 1) * PLT_ADDRESS_OFFSET + plt_address; let func_offset = (i as u64 + 1) * PLT_ADDRESS_OFFSET + plt_offset; - println!("{}", symbol.name().unwrap().to_string()); app_func_addresses.insert(func_address, symbol.name().unwrap()); md.plt_addresses.insert( symbol.name().unwrap().to_string(), diff --git a/ult = result ^ roc_memcpy_ptr b/ult = result ^ roc_memcpy_ptr deleted file mode 100644 index 88b26daf7c..0000000000 --- a/ult = result ^ roc_memcpy_ptr +++ /dev/null @@ -1,651 +0,0 @@ - -examples/hello-rust/platform/dynhost: file format elf64-x86-64 - -DYNAMIC RELOCATION RECORDS -OFFSET TYPE VALUE -000000000003f520 R_X86_64_RELATIVE *ABS*+0x00000000000112f0 -000000000003f528 R_X86_64_RELATIVE *ABS*+0x0000000000023b70 -000000000003f530 R_X86_64_RELATIVE *ABS*+0x0000000000011330 -000000000003f538 R_X86_64_RELATIVE *ABS*+0x00000000000113f0 -000000000003f550 R_X86_64_RELATIVE *ABS*+0x00000000000113d0 -000000000003f558 R_X86_64_RELATIVE *ABS*+0x00000000000113d0 -000000000003f560 R_X86_64_RELATIVE *ABS*+0x00000000000113e0 -000000000003f568 R_X86_64_RELATIVE *ABS*+0x0000000000006a10 -000000000003f580 R_X86_64_RELATIVE *ABS*+0x0000000000011560 -000000000003f598 R_X86_64_RELATIVE *ABS*+0x00000000000115f0 -000000000003f5a0 R_X86_64_RELATIVE *ABS*+0x0000000000011650 -000000000003f5b8 R_X86_64_RELATIVE *ABS*+0x0000000000011590 -000000000003f5c0 R_X86_64_RELATIVE *ABS*+0x0000000000011570 -000000000003f5c8 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 -000000000003f5e0 R_X86_64_RELATIVE *ABS*+0x0000000000015090 -000000000003f5e8 R_X86_64_RELATIVE *ABS*+0x0000000000014f80 -000000000003f5f0 R_X86_64_RELATIVE *ABS*+0x0000000000014f90 -000000000003f5f8 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 -000000000003f610 R_X86_64_RELATIVE *ABS*+0x0000000000015080 -000000000003f618 R_X86_64_RELATIVE *ABS*+0x0000000000014ea0 -000000000003f620 R_X86_64_RELATIVE *ABS*+0x0000000000014fe0 -000000000003f628 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 -000000000003f640 R_X86_64_RELATIVE *ABS*+0x0000000000015100 -000000000003f648 R_X86_64_RELATIVE *ABS*+0x0000000000014d80 -000000000003f650 R_X86_64_RELATIVE *ABS*+0x0000000000015030 -000000000003f658 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 -000000000003f670 R_X86_64_RELATIVE *ABS*+0x0000000000011870 -000000000003f678 R_X86_64_RELATIVE *ABS*+0x0000000000007ae8 -000000000003f690 R_X86_64_RELATIVE *ABS*+0x0000000000007b99 -000000000003f6a8 R_X86_64_RELATIVE *ABS*+0x0000000000007b99 -000000000003f6c0 R_X86_64_RELATIVE *ABS*+0x0000000000007b99 -000000000003f6d8 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 -000000000003f6f0 R_X86_64_RELATIVE *ABS*+0x00000000000116d0 -000000000003f6f8 R_X86_64_RELATIVE *ABS*+0x0000000000007d00 -000000000003f710 R_X86_64_RELATIVE *ABS*+0x0000000000007d00 -000000000003f728 R_X86_64_RELATIVE *ABS*+0x0000000000007d00 -000000000003f740 R_X86_64_RELATIVE *ABS*+0x0000000000007d70 -000000000003f758 R_X86_64_RELATIVE *ABS*+0x0000000000007d70 -000000000003f770 R_X86_64_RELATIVE *ABS*+0x0000000000007d70 -000000000003f788 R_X86_64_RELATIVE *ABS*+0x0000000000007d70 -000000000003f7a0 R_X86_64_RELATIVE *ABS*+0x0000000000007d70 -000000000003f7b8 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 -000000000003f7d0 R_X86_64_RELATIVE *ABS*+0x000000000001d480 -000000000003f7d8 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 -000000000003f7f0 R_X86_64_RELATIVE *ABS*+0x00000000000391b0 -000000000003f7f8 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 -000000000003f810 R_X86_64_RELATIVE *ABS*+0x0000000000039190 -000000000003f818 R_X86_64_RELATIVE *ABS*+0x0000000000012420 -000000000003f830 R_X86_64_RELATIVE *ABS*+0x00000000000239d0 -000000000003f838 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 -000000000003f850 R_X86_64_RELATIVE *ABS*+0x000000000003e1c0 -000000000003f858 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 -000000000003f870 R_X86_64_RELATIVE *ABS*+0x0000000000011700 -000000000003f878 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 -000000000003f890 R_X86_64_RELATIVE *ABS*+0x0000000000011810 -000000000003f898 R_X86_64_RELATIVE *ABS*+0x0000000000007e14 -000000000003f8b0 R_X86_64_RELATIVE *ABS*+0x0000000000007e60 -000000000003f8c8 R_X86_64_RELATIVE *ABS*+0x0000000000007e60 -000000000003f8e0 R_X86_64_RELATIVE *ABS*+0x0000000000007e60 -000000000003f8f8 R_X86_64_RELATIVE *ABS*+0x0000000000007e60 -000000000003f910 R_X86_64_RELATIVE *ABS*+0x0000000000007e60 -000000000003f928 R_X86_64_RELATIVE *ABS*+0x0000000000007eaa -000000000003f940 R_X86_64_RELATIVE *ABS*+0x0000000000007eaa -000000000003f958 R_X86_64_RELATIVE *ABS*+0x0000000000007eaa -000000000003f970 R_X86_64_RELATIVE *ABS*+0x0000000000007eaa -000000000003f988 R_X86_64_RELATIVE *ABS*+0x0000000000007b99 -000000000003f9a0 R_X86_64_RELATIVE *ABS*+0x0000000000007f44 -000000000003f9b8 R_X86_64_RELATIVE *ABS*+0x0000000000007f44 -000000000003f9d0 R_X86_64_RELATIVE *ABS*+0x0000000000007f44 -000000000003f9e8 R_X86_64_RELATIVE *ABS*+0x0000000000007f44 -000000000003fa00 R_X86_64_RELATIVE *ABS*+0x0000000000007f44 -000000000003fa18 R_X86_64_RELATIVE *ABS*+0x0000000000007f44 -000000000003fa30 R_X86_64_RELATIVE *ABS*+0x0000000000007f44 -000000000003fa48 R_X86_64_RELATIVE *ABS*+0x0000000000007fe0 -000000000003fa60 R_X86_64_RELATIVE *ABS*+0x000000000000805d -000000000003fa78 R_X86_64_RELATIVE *ABS*+0x000000000000805d -000000000003fa90 R_X86_64_RELATIVE *ABS*+0x000000000000805d -000000000003faa8 R_X86_64_RELATIVE *ABS*+0x000000000000805d -000000000003fac0 R_X86_64_RELATIVE *ABS*+0x0000000000008184 -000000000003fad0 R_X86_64_RELATIVE *ABS*+0x00000000000081a8 -000000000003fae0 R_X86_64_RELATIVE *ABS*+0x000000000000816e -000000000003faf8 R_X86_64_RELATIVE *ABS*+0x00000000000081ab -000000000003fb08 R_X86_64_RELATIVE *ABS*+0x00000000000081cc -000000000003fb20 R_X86_64_RELATIVE *ABS*+0x00000000000081f4 -000000000003fb30 R_X86_64_RELATIVE *ABS*+0x00000000000081cc -000000000003fb48 R_X86_64_RELATIVE *ABS*+0x0000000000007ae8 -000000000003fb58 R_X86_64_RELATIVE *ABS*+0x0000000000007ae8 -000000000003fb68 R_X86_64_RELATIVE *ABS*+0x0000000000008336 -000000000003fb78 R_X86_64_RELATIVE *ABS*+0x0000000000008341 -000000000003fb88 R_X86_64_RELATIVE *ABS*+0x0000000000008342 -000000000003fb98 R_X86_64_RELATIVE *ABS*+0x000000000000835e -000000000003fbb0 R_X86_64_RELATIVE *ABS*+0x000000000000837b -000000000003fbc8 R_X86_64_RELATIVE *ABS*+0x000000000000837b -000000000003fbe0 R_X86_64_RELATIVE *ABS*+0x0000000000008394 -000000000003fbf0 R_X86_64_RELATIVE *ABS*+0x0000000000013010 -000000000003fc08 R_X86_64_RELATIVE *ABS*+0x000000000001ef40 -000000000003fc10 R_X86_64_RELATIVE *ABS*+0x0000000000011910 -000000000003fc18 R_X86_64_RELATIVE *ABS*+0x0000000000011b40 -000000000003fc20 R_X86_64_RELATIVE *ABS*+0x0000000000013010 -000000000003fc38 R_X86_64_RELATIVE *ABS*+0x000000000001eda0 -000000000003fc40 R_X86_64_RELATIVE *ABS*+0x0000000000011a20 -000000000003fc48 R_X86_64_RELATIVE *ABS*+0x0000000000011b00 -000000000003fc50 R_X86_64_RELATIVE *ABS*+0x00000000000083a5 -000000000003fc68 R_X86_64_RELATIVE *ABS*+0x00000000000083a5 -000000000003fc80 R_X86_64_RELATIVE *ABS*+0x00000000000083a5 -000000000003fc98 R_X86_64_RELATIVE *ABS*+0x00000000000083a5 -000000000003fcb0 R_X86_64_RELATIVE *ABS*+0x00000000000083a5 -000000000003fcc8 R_X86_64_RELATIVE *ABS*+0x00000000000083a5 -000000000003fce0 R_X86_64_RELATIVE *ABS*+0x00000000000083a5 -000000000003fcf8 R_X86_64_RELATIVE *ABS*+0x00000000000083a5 -000000000003fd10 R_X86_64_RELATIVE *ABS*+0x00000000000083a5 -000000000003fd28 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 -000000000003fd40 R_X86_64_RELATIVE *ABS*+0x000000000001fe50 -000000000003fd48 R_X86_64_RELATIVE *ABS*+0x0000000000011c00 -000000000003fd50 R_X86_64_RELATIVE *ABS*+0x00000000000083bc -000000000003fd68 R_X86_64_RELATIVE *ABS*+0x00000000000083bc -000000000003fd80 R_X86_64_RELATIVE *ABS*+0x00000000000083bc -000000000003fd98 R_X86_64_RELATIVE *ABS*+0x00000000000083bc -000000000003fdb0 R_X86_64_RELATIVE *ABS*+0x00000000000083bc -000000000003fdc8 R_X86_64_RELATIVE *ABS*+0x000000000000843b -000000000003fdd8 R_X86_64_RELATIVE *ABS*+0x0000000000013090 -000000000003fdf0 R_X86_64_RELATIVE *ABS*+0x00000000000207d0 -000000000003fdf8 R_X86_64_RELATIVE *ABS*+0x0000000000011b80 -000000000003fe00 R_X86_64_RELATIVE *ABS*+0x000000000000844c -000000000003fe10 R_X86_64_RELATIVE *ABS*+0x00000000000083a4 -000000000003fe20 R_X86_64_RELATIVE *ABS*+0x0000000000007ae8 -000000000003fe30 R_X86_64_RELATIVE *ABS*+0x00000000000084e3 -000000000003fe40 R_X86_64_RELATIVE *ABS*+0x0000000000008520 -000000000003fe58 R_X86_64_RELATIVE *ABS*+0x0000000000008520 -000000000003fe70 R_X86_64_RELATIVE *ABS*+0x0000000000008520 -000000000003fe88 R_X86_64_RELATIVE *ABS*+0x0000000000008520 -000000000003fea0 R_X86_64_RELATIVE *ABS*+0x0000000000008520 -000000000003feb8 R_X86_64_RELATIVE *ABS*+0x0000000000008520 -000000000003fed0 R_X86_64_RELATIVE *ABS*+0x0000000000008520 -000000000003fee8 R_X86_64_RELATIVE *ABS*+0x000000000000856f -000000000003fef8 R_X86_64_RELATIVE *ABS*+0x0000000000008584 -000000000003ff08 R_X86_64_RELATIVE *ABS*+0x0000000000008585 -000000000003ff18 R_X86_64_RELATIVE *ABS*+0x00000000000085a2 -000000000003ff28 R_X86_64_RELATIVE *ABS*+0x00000000000085b7 -000000000003ff38 R_X86_64_RELATIVE *ABS*+0x00000000000085c5 -000000000003ff48 R_X86_64_RELATIVE *ABS*+0x00000000000085e1 -000000000003ff58 R_X86_64_RELATIVE *ABS*+0x0000000000008605 -000000000003ff70 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 -000000000003ff88 R_X86_64_RELATIVE *ABS*+0x00000000000249d0 -000000000003ff90 R_X86_64_RELATIVE *ABS*+0x0000000000024a30 -000000000003ff98 R_X86_64_RELATIVE *ABS*+0x0000000000024a90 -000000000003ffa0 R_X86_64_RELATIVE *ABS*+0x0000000000024aa0 -000000000003ffa8 R_X86_64_RELATIVE *ABS*+0x000000000001e550 -000000000003ffb0 R_X86_64_RELATIVE *ABS*+0x000000000001e640 -000000000003ffb8 R_X86_64_RELATIVE *ABS*+0x000000000001ec50 -000000000003ffc8 R_X86_64_RELATIVE *ABS*+0x0000000000012190 -000000000003ffe0 R_X86_64_RELATIVE *ABS*+0x000000000001e2c0 -000000000003ffe8 R_X86_64_RELATIVE *ABS*+0x000000000001e330 -000000000003fff0 R_X86_64_RELATIVE *ABS*+0x000000000001e4c0 -000000000003fff8 R_X86_64_RELATIVE *ABS*+0x000000000001e540 -0000000000040000 R_X86_64_RELATIVE *ABS*+0x000000000001e4d0 -0000000000040008 R_X86_64_RELATIVE *ABS*+0x000000000001e890 -0000000000040010 R_X86_64_RELATIVE *ABS*+0x000000000001eb00 -0000000000040020 R_X86_64_RELATIVE *ABS*+0x0000000000008150 -0000000000040030 R_X86_64_RELATIVE *ABS*+0x0000000000008636 -0000000000040040 R_X86_64_RELATIVE *ABS*+0x0000000000008645 -0000000000040050 R_X86_64_RELATIVE *ABS*+0x0000000000008584 -0000000000040060 R_X86_64_RELATIVE *ABS*+0x0000000000008648 -0000000000040070 R_X86_64_RELATIVE *ABS*+0x0000000000008605 -0000000000040088 R_X86_64_RELATIVE *ABS*+0x0000000000008605 -00000000000400a0 R_X86_64_RELATIVE *ABS*+0x0000000000012d90 -00000000000400b8 R_X86_64_RELATIVE *ABS*+0x0000000000022690 -00000000000400c0 R_X86_64_RELATIVE *ABS*+0x0000000000022790 -00000000000400c8 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 -00000000000400e0 R_X86_64_RELATIVE *ABS*+0x0000000000022830 -00000000000400e8 R_X86_64_RELATIVE *ABS*+0x0000000000022880 -00000000000400f0 R_X86_64_RELATIVE *ABS*+0x0000000000012190 -0000000000040108 R_X86_64_RELATIVE *ABS*+0x00000000000116e0 -0000000000040110 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 -0000000000040128 R_X86_64_RELATIVE *ABS*+0x00000000000116f0 -0000000000040130 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 -0000000000040148 R_X86_64_RELATIVE *ABS*+0x00000000000228f0 -0000000000040150 R_X86_64_RELATIVE *ABS*+0x0000000000022950 -0000000000040158 R_X86_64_RELATIVE *ABS*+0x0000000000008696 -0000000000040168 R_X86_64_RELATIVE *ABS*+0x0000000000007ae8 -0000000000040178 R_X86_64_RELATIVE *ABS*+0x00000000000086c8 -0000000000040188 R_X86_64_RELATIVE *ABS*+0x00000000000086f9 -0000000000040198 R_X86_64_RELATIVE *ABS*+0x0000000000007c20 -00000000000401a8 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 -00000000000401c0 R_X86_64_RELATIVE *ABS*+0x0000000000020a40 -00000000000401c8 R_X86_64_RELATIVE *ABS*+0x0000000000011c20 -00000000000401d0 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 -00000000000401e8 R_X86_64_RELATIVE *ABS*+0x0000000000020810 -00000000000401f0 R_X86_64_RELATIVE *ABS*+0x0000000000011bf0 -00000000000401f8 R_X86_64_RELATIVE *ABS*+0x0000000000008724 -0000000000040210 R_X86_64_RELATIVE *ABS*+0x0000000000008758 -0000000000040220 R_X86_64_RELATIVE *ABS*+0x0000000000007ae8 -0000000000040230 R_X86_64_RELATIVE *ABS*+0x0000000000008379 -0000000000040240 R_X86_64_RELATIVE *ABS*+0x0000000000007ae8 -0000000000040250 R_X86_64_RELATIVE *ABS*+0x00000000000087d0 -0000000000040260 R_X86_64_RELATIVE *ABS*+0x00000000000084da -0000000000040270 R_X86_64_RELATIVE *ABS*+0x0000000000006b40 -0000000000040280 R_X86_64_RELATIVE *ABS*+0x00000000000083a3 -0000000000040290 R_X86_64_RELATIVE *ABS*+0x0000000000008584 -00000000000402a0 R_X86_64_RELATIVE *ABS*+0x00000000000087fd -00000000000402b8 R_X86_64_RELATIVE *ABS*+0x0000000000011c30 -00000000000402d0 R_X86_64_RELATIVE *ABS*+0x0000000000011780 -00000000000402d8 R_X86_64_RELATIVE *ABS*+0x000000000000884a -00000000000402f0 R_X86_64_RELATIVE *ABS*+0x000000000000887a -0000000000040308 R_X86_64_RELATIVE *ABS*+0x000000000000887a -0000000000040320 R_X86_64_RELATIVE *ABS*+0x00000000000088a6 -0000000000040330 R_X86_64_RELATIVE *ABS*+0x0000000000008902 -0000000000040348 R_X86_64_RELATIVE *ABS*+0x0000000000008902 -0000000000040360 R_X86_64_RELATIVE *ABS*+0x000000000000894d -0000000000040370 R_X86_64_RELATIVE *ABS*+0x0000000000008956 -0000000000040380 R_X86_64_RELATIVE *ABS*+0x0000000000008971 -0000000000040390 R_X86_64_RELATIVE *ABS*+0x000000000000897f -00000000000403a0 R_X86_64_RELATIVE *ABS*+0x00000000000089a8 -00000000000403b8 R_X86_64_RELATIVE *ABS*+0x00000000000089d2 -00000000000403c8 R_X86_64_RELATIVE *ABS*+0x00000000000089a8 -00000000000403e0 R_X86_64_RELATIVE *ABS*+0x0000000000008a01 -00000000000403f8 R_X86_64_RELATIVE *ABS*+0x0000000000008a01 -0000000000040410 R_X86_64_RELATIVE *ABS*+0x0000000000008a01 -0000000000040428 R_X86_64_RELATIVE *ABS*+0x0000000000008a23 -0000000000040440 R_X86_64_RELATIVE *ABS*+0x0000000000008a96 -0000000000040458 R_X86_64_RELATIVE *ABS*+0x0000000000008abb -0000000000040470 R_X86_64_RELATIVE *ABS*+0x0000000000008af7 -0000000000040488 R_X86_64_RELATIVE *ABS*+0x0000000000008af7 -00000000000404a0 R_X86_64_RELATIVE *ABS*+0x0000000000008b2d -00000000000404b8 R_X86_64_RELATIVE *ABS*+0x000000000002d900 -00000000000404d0 R_X86_64_RELATIVE *ABS*+0x000000000002dbc0 -00000000000404d8 R_X86_64_RELATIVE *ABS*+0x000000000002dbc0 -00000000000404e0 R_X86_64_RELATIVE *ABS*+0x000000000002d880 -00000000000404e8 R_X86_64_RELATIVE *ABS*+0x000000000002d900 -0000000000040500 R_X86_64_RELATIVE *ABS*+0x000000000002dbd0 -0000000000040508 R_X86_64_RELATIVE *ABS*+0x000000000002dbd0 -0000000000040510 R_X86_64_RELATIVE *ABS*+0x000000000002d870 -0000000000040518 R_X86_64_RELATIVE *ABS*+0x0000000000008c57 -0000000000040530 R_X86_64_RELATIVE *ABS*+0x0000000000008c57 -0000000000040548 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040560 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040578 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040590 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -00000000000405a8 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -00000000000405c0 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -00000000000405d8 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -00000000000405f0 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040608 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040620 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040638 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040650 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040668 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040680 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040698 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -00000000000406b0 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -00000000000406c8 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -00000000000406e0 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -00000000000406f8 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040710 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040728 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040740 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040758 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040770 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040788 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -00000000000407a0 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -00000000000407b8 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -00000000000407d0 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -00000000000407e8 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040800 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040818 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040830 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040848 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040860 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040878 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040890 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -00000000000408a8 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -00000000000408c0 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -00000000000408d8 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -00000000000408f0 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040908 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040920 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040938 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040950 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040968 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040980 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040998 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -00000000000409b0 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -00000000000409c8 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -00000000000409e0 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -00000000000409f8 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040a10 R_X86_64_RELATIVE *ABS*+0x0000000000008cb7 -0000000000040a28 R_X86_64_RELATIVE *ABS*+0x0000000000008d92 -0000000000040a40 R_X86_64_RELATIVE *ABS*+0x0000000000008d92 -0000000000040a58 R_X86_64_RELATIVE *ABS*+0x00000000000315f0 -0000000000040a70 R_X86_64_RELATIVE *ABS*+0x0000000000031590 -0000000000040a78 R_X86_64_RELATIVE *ABS*+0x000000000000904b -0000000000040a90 R_X86_64_RELATIVE *ABS*+0x00000000000090db -0000000000040aa8 R_X86_64_RELATIVE *ABS*+0x00000000000090db -0000000000040ac0 R_X86_64_RELATIVE *ABS*+0x00000000000090db -0000000000040ad8 R_X86_64_RELATIVE *ABS*+0x00000000000090db -0000000000040af0 R_X86_64_RELATIVE *ABS*+0x00000000000090db -0000000000040b08 R_X86_64_RELATIVE *ABS*+0x0000000000009260 -0000000000040b20 R_X86_64_RELATIVE *ABS*+0x0000000000009260 -0000000000040b38 R_X86_64_RELATIVE *ABS*+0x0000000000009260 -0000000000040b50 R_X86_64_RELATIVE *ABS*+0x000000000000960e -0000000000040b68 R_X86_64_RELATIVE *ABS*+0x000000000000960e -0000000000040b80 R_X86_64_RELATIVE *ABS*+0x000000000000960e -0000000000040b98 R_X86_64_RELATIVE *ABS*+0x00000000000331f0 -0000000000040bb0 R_X86_64_RELATIVE *ABS*+0x000000000003d290 -0000000000040bb8 R_X86_64_RELATIVE *ABS*+0x000000000000960e -0000000000040bd0 R_X86_64_RELATIVE *ABS*+0x000000000000960e -0000000000040be8 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 -0000000000040c00 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 -0000000000040c18 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 -0000000000040c30 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 -0000000000040c48 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 -0000000000040c60 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 -0000000000040c78 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 -0000000000040c90 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 -0000000000040ca8 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 -0000000000040cc0 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 -0000000000040cd8 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 -0000000000040cf0 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 -0000000000040d08 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 -0000000000040d20 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 -0000000000040d38 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 -0000000000040d50 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 -0000000000040d68 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 -0000000000040d80 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 -0000000000040d98 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 -0000000000040db0 R_X86_64_RELATIVE *ABS*+0x00000000000096b3 -0000000000040dc8 R_X86_64_RELATIVE *ABS*+0x0000000000009712 -0000000000040de0 R_X86_64_RELATIVE *ABS*+0x0000000000009712 -0000000000040df8 R_X86_64_RELATIVE *ABS*+0x0000000000009712 -0000000000040e10 R_X86_64_RELATIVE *ABS*+0x0000000000009712 -0000000000040e28 R_X86_64_RELATIVE *ABS*+0x0000000000009712 -0000000000040e40 R_X86_64_RELATIVE *ABS*+0x0000000000009712 -0000000000040e58 R_X86_64_RELATIVE *ABS*+0x0000000000009712 -0000000000040e70 R_X86_64_RELATIVE *ABS*+0x0000000000009712 -0000000000040e88 R_X86_64_RELATIVE *ABS*+0x0000000000009712 -0000000000040ea0 R_X86_64_RELATIVE *ABS*+0x0000000000009712 -0000000000040eb8 R_X86_64_RELATIVE *ABS*+0x0000000000009712 -0000000000040ed0 R_X86_64_RELATIVE *ABS*+0x0000000000009712 -0000000000040ee8 R_X86_64_RELATIVE *ABS*+0x0000000000009712 -0000000000040f00 R_X86_64_RELATIVE *ABS*+0x0000000000009712 -0000000000040f18 R_X86_64_RELATIVE *ABS*+0x000000000000979a -0000000000040f28 R_X86_64_RELATIVE *ABS*+0x00000000000097d8 -0000000000040f40 R_X86_64_RELATIVE *ABS*+0x00000000000097d8 -0000000000040f58 R_X86_64_RELATIVE *ABS*+0x0000000000009828 -0000000000040f70 R_X86_64_RELATIVE *ABS*+0x0000000000009939 -0000000000040f80 R_X86_64_RELATIVE *ABS*+0x0000000000009975 -0000000000040f98 R_X86_64_RELATIVE *ABS*+0x0000000000009990 -0000000000040fa8 R_X86_64_RELATIVE *ABS*+0x0000000000009938 -0000000000040fb8 R_X86_64_RELATIVE *ABS*+0x0000000000038f70 -0000000000040fd0 R_X86_64_RELATIVE *ABS*+0x0000000000039180 -0000000000040fd8 R_X86_64_RELATIVE *ABS*+0x00000000000099e2 -0000000000040fe8 R_X86_64_RELATIVE *ABS*+0x00000000000099e3 -0000000000040ff8 R_X86_64_RELATIVE *ABS*+0x0000000000009938 -0000000000041008 R_X86_64_RELATIVE *ABS*+0x00000000000099e6 -0000000000041018 R_X86_64_RELATIVE *ABS*+0x00000000000099e6 -0000000000041028 R_X86_64_RELATIVE *ABS*+0x0000000000007c80 -0000000000041038 R_X86_64_RELATIVE *ABS*+0x00000000000099e7 -0000000000041048 R_X86_64_RELATIVE *ABS*+0x0000000000009a04 -0000000000041058 R_X86_64_RELATIVE *ABS*+0x0000000000009a1d -0000000000041068 R_X86_64_RELATIVE *ABS*+0x0000000000009a2f -0000000000041078 R_X86_64_RELATIVE *ABS*+0x0000000000009a3b -0000000000041088 R_X86_64_RELATIVE *ABS*+0x0000000000009a04 -0000000000041098 R_X86_64_RELATIVE *ABS*+0x0000000000009a1d -00000000000410a8 R_X86_64_RELATIVE *ABS*+0x0000000000009a2f -00000000000410b8 R_X86_64_RELATIVE *ABS*+0x0000000000009a3e -00000000000410c8 R_X86_64_RELATIVE *ABS*+0x0000000000009938 -00000000000410d8 R_X86_64_RELATIVE *ABS*+0x0000000000009a3f -00000000000410e8 R_X86_64_RELATIVE *ABS*+0x0000000000038f70 -0000000000041100 R_X86_64_RELATIVE *ABS*+0x0000000000039880 -0000000000041108 R_X86_64_RELATIVE *ABS*+0x000000000003a060 -0000000000041110 R_X86_64_RELATIVE *ABS*+0x000000000003a140 -0000000000041118 R_X86_64_RELATIVE *ABS*+0x0000000000007ce0 -0000000000041130 R_X86_64_RELATIVE *ABS*+0x0000000000007ce0 -0000000000041148 R_X86_64_RELATIVE *ABS*+0x0000000000038f70 -0000000000041160 R_X86_64_RELATIVE *ABS*+0x000000000003deb0 -0000000000041168 R_X86_64_RELATIVE *ABS*+0x0000000000009a56 -0000000000041180 R_X86_64_RELATIVE *ABS*+0x0000000000038f70 -0000000000041198 R_X86_64_RELATIVE *ABS*+0x000000000003a180 -00000000000411a0 R_X86_64_RELATIVE *ABS*+0x000000000003a190 -00000000000411a8 R_X86_64_RELATIVE *ABS*+0x000000000003a270 -00000000000411b0 R_X86_64_RELATIVE *ABS*+0x0000000000007c60 -00000000000411c8 R_X86_64_RELATIVE *ABS*+0x0000000000009b3b -00000000000411d8 R_X86_64_RELATIVE *ABS*+0x0000000000009b4d -00000000000411e8 R_X86_64_RELATIVE *ABS*+0x0000000000006c30 -00000000000411f8 R_X86_64_RELATIVE *ABS*+0x0000000000009b4d -0000000000041208 R_X86_64_RELATIVE *ABS*+0x0000000000009b6f -0000000000041218 R_X86_64_RELATIVE *ABS*+0x0000000000009b85 -0000000000041228 R_X86_64_RELATIVE *ABS*+0x0000000000009b92 -0000000000041238 R_X86_64_RELATIVE *ABS*+0x0000000000009ba7 -0000000000041248 R_X86_64_RELATIVE *ABS*+0x0000000000009a52 -0000000000041258 R_X86_64_RELATIVE *ABS*+0x0000000000009bfc -0000000000041270 R_X86_64_RELATIVE *ABS*+0x0000000000009d1f -0000000000041288 R_X86_64_RELATIVE *ABS*+0x0000000000009d1f -00000000000412a0 R_X86_64_RELATIVE *ABS*+0x0000000000009d1f -00000000000412b8 R_X86_64_RELATIVE *ABS*+0x0000000000009d1f -00000000000412d0 R_X86_64_RELATIVE *ABS*+0x0000000000009d1f -00000000000412e8 R_X86_64_RELATIVE *ABS*+0x0000000000009d1f -0000000000041300 R_X86_64_RELATIVE *ABS*+0x0000000000009d3e -0000000000041318 R_X86_64_RELATIVE *ABS*+0x0000000000009d3e -0000000000041330 R_X86_64_RELATIVE *ABS*+0x0000000000009d3e -0000000000041348 R_X86_64_RELATIVE *ABS*+0x0000000000009d3e -0000000000041360 R_X86_64_RELATIVE *ABS*+0x0000000000009d3e -0000000000041378 R_X86_64_RELATIVE *ABS*+0x0000000000009d3e -0000000000041390 R_X86_64_RELATIVE *ABS*+0x0000000000009d3e -00000000000413a8 R_X86_64_RELATIVE *ABS*+0x0000000000009d3e -00000000000413c0 R_X86_64_RELATIVE *ABS*+0x0000000000009d83 -00000000000413d0 R_X86_64_RELATIVE *ABS*+0x0000000000009d8e -00000000000413e0 R_X86_64_RELATIVE *ABS*+0x0000000000009a3e -00000000000413f0 R_X86_64_RELATIVE *ABS*+0x0000000000009da4 -0000000000041400 R_X86_64_RELATIVE *ABS*+0x0000000000007f18 -0000000000041410 R_X86_64_RELATIVE *ABS*+0x0000000000006b50 -0000000000041420 R_X86_64_RELATIVE *ABS*+0x0000000000009a3e -0000000000041430 R_X86_64_RELATIVE *ABS*+0x0000000000009d83 -0000000000041440 R_X86_64_RELATIVE *ABS*+0x0000000000009db2 -0000000000041450 R_X86_64_RELATIVE *ABS*+0x0000000000008120 -0000000000041460 R_X86_64_RELATIVE *ABS*+0x0000000000009dd8 -0000000000041470 R_X86_64_RELATIVE *ABS*+0x0000000000009a3e -0000000000041480 R_X86_64_RELATIVE *ABS*+0x0000000000009dde -0000000000041498 R_X86_64_RELATIVE *ABS*+0x0000000000009dde -00000000000414b0 R_X86_64_RELATIVE *ABS*+0x000000000000a34a -00000000000414c8 R_X86_64_RELATIVE *ABS*+0x000000000000a34a -00000000000414e0 R_X86_64_RELATIVE *ABS*+0x000000000000a34a -00000000000414f8 R_X86_64_RELATIVE *ABS*+0x0000000000038f70 -0000000000041510 R_X86_64_RELATIVE *ABS*+0x000000000003e130 -0000000000041518 R_X86_64_RELATIVE *ABS*+0x0000000000038f70 -0000000000041530 R_X86_64_RELATIVE *ABS*+0x000000000003de00 -0000000000041538 R_X86_64_RELATIVE *ABS*+0x0000000000038f70 -0000000000041550 R_X86_64_RELATIVE *ABS*+0x000000000003e030 -0000000000041780 R_X86_64_RELATIVE *ABS*+0x00000000000114b0 -0000000000041788 R_X86_64_RELATIVE *ABS*+0x0000000000011470 -0000000000041790 R_X86_64_RELATIVE *ABS*+0x0000000000011460 -0000000000041798 R_X86_64_RELATIVE *ABS*+0x0000000000011490 -00000000000417a0 R_X86_64_RELATIVE *ABS*+0x0000000000011480 -00000000000417a8 R_X86_64_RELATIVE *ABS*+0x00000000000114a0 -00000000000417b0 R_X86_64_RELATIVE *ABS*+0x000000000001fe20 -00000000000417b8 R_X86_64_RELATIVE *ABS*+0x0000000000022dc0 -00000000000417c0 R_X86_64_RELATIVE *ABS*+0x0000000000011690 -00000000000417f8 R_X86_64_RELATIVE *ABS*+0x0000000000011660 -0000000000041800 R_X86_64_RELATIVE *ABS*+0x0000000000011680 -0000000000041810 R_X86_64_RELATIVE *ABS*+0x0000000000039480 -0000000000041818 R_X86_64_RELATIVE *ABS*+0x000000000001fe40 -0000000000041820 R_X86_64_RELATIVE *ABS*+0x0000000000011400 -0000000000041828 R_X86_64_RELATIVE *ABS*+0x0000000000038ad0 -0000000000041830 R_X86_64_RELATIVE *ABS*+0x0000000000022970 -0000000000041838 R_X86_64_RELATIVE *ABS*+0x000000000003b1c0 -0000000000041840 R_X86_64_RELATIVE *ABS*+0x000000000003d660 -0000000000041848 R_X86_64_RELATIVE *ABS*+0x000000000003b1d0 -0000000000041850 R_X86_64_RELATIVE *ABS*+0x000000000003d700 -0000000000041858 R_X86_64_RELATIVE *ABS*+0x000000000003dcd0 -0000000000041860 R_X86_64_RELATIVE *ABS*+0x0000000000020d80 -0000000000041868 R_X86_64_RELATIVE *ABS*+0x000000000003b240 -0000000000041870 R_X86_64_RELATIVE *ABS*+0x000000000003a020 -0000000000041878 R_X86_64_RELATIVE *ABS*+0x000000000003a030 -0000000000041880 R_X86_64_RELATIVE *ABS*+0x000000000003d520 -0000000000041888 R_X86_64_RELATIVE *ABS*+0x000000000003d5c0 -0000000000041890 R_X86_64_RELATIVE *ABS*+0x000000000003da60 -0000000000041898 R_X86_64_RELATIVE *ABS*+0x000000000003d3e0 -00000000000418a0 R_X86_64_RELATIVE *ABS*+0x000000000003d480 -00000000000418a8 R_X86_64_RELATIVE *ABS*+0x000000000003d9d0 -00000000000418b0 R_X86_64_RELATIVE *ABS*+0x0000000000039490 -00000000000418b8 R_X86_64_RELATIVE *ABS*+0x000000000003b290 -00000000000418c0 R_X86_64_RELATIVE *ABS*+0x000000000003a310 -00000000000418c8 R_X86_64_RELATIVE *ABS*+0x0000000000011410 -00000000000418e0 R_X86_64_RELATIVE *ABS*+0x0000000000042f78 -00000000000418e8 R_X86_64_RELATIVE *ABS*+0x0000000000022450 -00000000000418f0 R_X86_64_RELATIVE *ABS*+0x00000000000204c0 -0000000000041910 R_X86_64_RELATIVE *ABS*+0x000000000003b8d0 -0000000000041918 R_X86_64_RELATIVE *ABS*+0x000000000003bcd0 -0000000000041920 R_X86_64_RELATIVE *ABS*+0x0000000000039570 -0000000000041928 R_X86_64_RELATIVE *ABS*+0x000000000003cb90 -0000000000041930 R_X86_64_RELATIVE *ABS*+0x000000000003b850 -0000000000041938 R_X86_64_RELATIVE *ABS*+0x000000000003b950 -0000000000041940 R_X86_64_RELATIVE *ABS*+0x0000000000039520 -0000000000041948 R_X86_64_RELATIVE *ABS*+0x0000000000039630 -0000000000041950 R_X86_64_RELATIVE *ABS*+0x000000000003b1b0 -0000000000041960 R_X86_64_RELATIVE *ABS*+0x0000000000011420 -0000000000041968 R_X86_64_RELATIVE *ABS*+0x0000000000038c90 -0000000000041970 R_X86_64_RELATIVE *ABS*+0x00000000000331c0 -0000000000041978 R_X86_64_RELATIVE *ABS*+0x0000000000033190 -0000000000041980 R_X86_64_RELATIVE *ABS*+0x0000000000038cb0 -0000000000041988 R_X86_64_RELATIVE *ABS*+0x0000000000031480 -0000000000041990 R_X86_64_RELATIVE *ABS*+0x0000000000033150 -0000000000041998 R_X86_64_RELATIVE *ABS*+0x000000000003b1e0 -00000000000419a0 R_X86_64_RELATIVE *ABS*+0x0000000000039ce0 -00000000000419a8 R_X86_64_RELATIVE *ABS*+0x0000000000024ab0 -00000000000419b0 R_X86_64_RELATIVE *ABS*+0x0000000000038f30 -00000000000419c0 R_X86_64_RELATIVE *ABS*+0x000000000001da50 -00000000000419d0 R_X86_64_RELATIVE *ABS*+0x00000000000397f0 -00000000000419f0 R_X86_64_RELATIVE *ABS*+0x0000000000024bf0 -00000000000419f8 R_X86_64_RELATIVE *ABS*+0x000000000003b170 -0000000000041a08 R_X86_64_RELATIVE *ABS*+0x000000000001f5a0 -0000000000041a10 R_X86_64_RELATIVE *ABS*+0x000000000001efb0 -0000000000041a38 R_X86_64_RELATIVE *ABS*+0x0000000000039280 -0000000000041a40 R_X86_64_RELATIVE *ABS*+0x000000000001d870 -0000000000041a50 R_X86_64_RELATIVE *ABS*+0x0000000000038a00 -0000000000041a58 R_X86_64_RELATIVE *ABS*+0x000000000003ba50 -0000000000041a68 R_X86_64_RELATIVE *ABS*+0x000000000003c600 -0000000000041a70 R_X86_64_RELATIVE *ABS*+0x000000000003ca80 -0000000000041a78 R_X86_64_RELATIVE *ABS*+0x000000000001fb70 -0000000000041a80 R_X86_64_RELATIVE *ABS*+0x000000000003b650 -0000000000041a88 R_X86_64_RELATIVE *ABS*+0x000000000003b150 -0000000000041a90 R_X86_64_RELATIVE *ABS*+0x000000000003c610 -0000000000041a98 R_X86_64_RELATIVE *ABS*+0x000000000003c620 -0000000000041aa0 R_X86_64_RELATIVE *ABS*+0x00000000000391d0 -0000000000041aa8 R_X86_64_RELATIVE *ABS*+0x000000000003b270 -0000000000041ab0 R_X86_64_RELATIVE *ABS*+0x000000000003e2c0 -0000000000041ab8 R_X86_64_RELATIVE *ABS*+0x000000000003d000 -0000000000041ac0 R_X86_64_RELATIVE *ABS*+0x0000000000020010 -0000000000041ac8 R_X86_64_RELATIVE *ABS*+0x000000000001d6c0 -0000000000041ad8 R_X86_64_RELATIVE *ABS*+0x0000000000021630 -0000000000041af8 R_X86_64_RELATIVE *ABS*+0x000000000003a2d0 -0000000000041b10 R_X86_64_RELATIVE *ABS*+0x0000000000039310 -0000000000041b18 R_X86_64_RELATIVE *ABS*+0x00000000000392f0 -0000000000041b20 R_X86_64_RELATIVE *ABS*+0x000000000001e000 -0000000000041b28 R_X86_64_RELATIVE *ABS*+0x0000000000022550 -0000000000041b30 R_X86_64_RELATIVE *ABS*+0x00000000000205c0 -0000000000041b38 R_X86_64_RELATIVE *ABS*+0x000000000002dad0 -0000000000041b40 R_X86_64_RELATIVE *ABS*+0x0000000000022590 -0000000000041b48 R_X86_64_RELATIVE *ABS*+0x0000000000039300 -0000000000041b58 R_X86_64_RELATIVE *ABS*+0x0000000000039320 -0000000000041b60 R_X86_64_RELATIVE *ABS*+0x0000000000022cd0 -0000000000041b68 R_X86_64_RELATIVE *ABS*+0x000000000002db20 -0000000000041b70 R_X86_64_RELATIVE *ABS*+0x000000000003dba0 -0000000000041bc0 R_X86_64_RELATIVE *ABS*+0x00000000000212f0 -0000000000041bc8 R_X86_64_RELATIVE *ABS*+0x00000000000224b0 -0000000000041bd0 R_X86_64_RELATIVE *ABS*+0x00000000000389a0 -0000000000041bd8 R_X86_64_RELATIVE *ABS*+0x000000000003a2c0 -0000000000041be0 R_X86_64_RELATIVE *ABS*+0x0000000000024f90 -0000000000041be8 R_X86_64_RELATIVE *ABS*+0x000000000003b200 -0000000000041bf0 R_X86_64_RELATIVE *ABS*+0x0000000000039d30 -0000000000041bf8 R_X86_64_RELATIVE *ABS*+0x0000000000039e80 -0000000000041c50 R_X86_64_RELATIVE *ABS*+0x0000000000038a10 -0000000000041c58 R_X86_64_RELATIVE *ABS*+0x0000000000011430 -0000000000041c68 R_X86_64_RELATIVE *ABS*+0x000000000001db70 -0000000000041c70 R_X86_64_RELATIVE *ABS*+0x000000000003e4a0 -0000000000041c78 R_X86_64_RELATIVE *ABS*+0x0000000000031310 -0000000000041c80 R_X86_64_RELATIVE *ABS*+0x0000000000031300 -0000000000041c88 R_X86_64_RELATIVE *ABS*+0x0000000000031990 -0000000000041c90 R_X86_64_RELATIVE *ABS*+0x0000000000031aa0 -0000000000041c98 R_X86_64_RELATIVE *ABS*+0x0000000000032fc0 -0000000000041ca0 R_X86_64_RELATIVE *ABS*+0x0000000000032fe0 -0000000000041ca8 R_X86_64_RELATIVE *ABS*+0x0000000000032f30 -0000000000041cb0 R_X86_64_RELATIVE *ABS*+0x0000000000031ae0 -0000000000041cb8 R_X86_64_RELATIVE *ABS*+0x000000000002ded0 -0000000000041cc0 R_X86_64_RELATIVE *ABS*+0x000000000002ea40 -0000000000041cc8 R_X86_64_RELATIVE *ABS*+0x0000000000023d10 -0000000000041ce8 R_X86_64_RELATIVE *ABS*+0x0000000000021ab0 -0000000000041cf8 R_X86_64_RELATIVE *ABS*+0x0000000000021a00 -0000000000041d28 R_X86_64_RELATIVE *ABS*+0x0000000000030e90 -0000000000041d30 R_X86_64_RELATIVE *ABS*+0x000000000003b9d0 -0000000000041d38 R_X86_64_RELATIVE *ABS*+0x000000000003d660 -0000000000041d40 R_X86_64_RELATIVE *ABS*+0x000000000003d700 -0000000000041d48 R_X86_64_RELATIVE *ABS*+0x000000000003dcd0 -0000000000041d50 R_X86_64_RELATIVE *ABS*+0x0000000000038af0 -0000000000041d58 R_X86_64_RELATIVE *ABS*+0x000000000003b730 -0000000000041d60 R_X86_64_RELATIVE *ABS*+0x000000000003d350 -0000000000041d68 R_X86_64_RELATIVE *ABS*+0x000000000003d340 -0000000000041d70 R_X86_64_RELATIVE *ABS*+0x000000000003e2a0 -0000000000041d78 R_X86_64_RELATIVE *ABS*+0x000000000003bcb0 -0000000000041d80 R_X86_64_RELATIVE *ABS*+0x0000000000034040 -0000000000041d88 R_X86_64_RELATIVE *ABS*+0x000000000003b2b0 -0000000000041d90 R_X86_64_RELATIVE *ABS*+0x0000000000037c40 -0000000000041d98 R_X86_64_RELATIVE *ABS*+0x0000000000033440 -0000000000041da0 R_X86_64_RELATIVE *ABS*+0x0000000000011440 -0000000000041da8 R_X86_64_RELATIVE *ABS*+0x0000000000021860 -0000000000041db0 R_X86_64_RELATIVE *ABS*+0x00000000000395f0 -0000000000041db8 R_X86_64_RELATIVE *ABS*+0x0000000000039880 -0000000000041dc0 R_X86_64_RELATIVE *ABS*+0x000000000003aaa0 -0000000000041dc8 R_X86_64_RELATIVE *ABS*+0x0000000000039b30 -0000000000041dd0 R_X86_64_RELATIVE *ABS*+0x000000000003a530 -0000000000042e08 R_X86_64_RELATIVE *ABS*+0x0000000000042e08 -0000000000042e10 R_X86_64_RELATIVE *ABS*+0x000000000002dbe0 -0000000000042e28 R_X86_64_RELATIVE *ABS*+0x00000000000214f0 -0000000000042e38 R_X86_64_RELATIVE *ABS*+0x0000000000042e08 -0000000000042e40 R_X86_64_RELATIVE *ABS*+0x0000000000008ab5 -0000000000041758 R_X86_64_GLOB_DAT __libc_start_main@GLIBC_2.2.5 -0000000000041760 R_X86_64_GLOB_DAT __gmon_start__@Base -0000000000041768 R_X86_64_GLOB_DAT _ITM_deregisterTMCloneTable@Base -0000000000041770 R_X86_64_GLOB_DAT _ITM_registerTMCloneTable@Base -0000000000041778 R_X86_64_GLOB_DAT __cxa_finalize@GLIBC_2.2.5 -00000000000417d8 R_X86_64_GLOB_DAT free@GLIBC_2.2.5 -00000000000417c8 R_X86_64_GLOB_DAT malloc@GLIBC_2.2.5 -00000000000417e0 R_X86_64_GLOB_DAT memcpy@GLIBC_2.14 -00000000000417e8 R_X86_64_GLOB_DAT memset@GLIBC_2.2.5 -00000000000417d0 R_X86_64_GLOB_DAT realloc@GLIBC_2.2.5 -00000000000417f0 R_X86_64_GLOB_DAT roc__mainForHost_1_exposed@Base -0000000000041808 R_X86_64_GLOB_DAT write@GLIBC_2.2.5 -0000000000041c00 R_X86_64_GLOB_DAT bcmp@GLIBC_2.2.5 -0000000000041a48 R_X86_64_GLOB_DAT _Unwind_Backtrace@GCC_3.3 -0000000000041a60 R_X86_64_GLOB_DAT _Unwind_GetIP@GCC_3.0 -0000000000041c48 R_X86_64_GLOB_DAT __cxa_thread_atexit_impl@GLIBC_2.18 -00000000000419e8 R_X86_64_GLOB_DAT __errno_location@GLIBC_2.2.5 -0000000000041c20 R_X86_64_GLOB_DAT __xpg_strerror_r@GLIBC_2.3.4 -0000000000041b80 R_X86_64_GLOB_DAT abort@GLIBC_2.2.5 -0000000000041b08 R_X86_64_GLOB_DAT calloc@GLIBC_2.2.5 -00000000000418d8 R_X86_64_GLOB_DAT close@GLIBC_2.2.5 -0000000000041c60 R_X86_64_GLOB_DAT dl_iterate_phdr@GLIBC_2.2.5 -0000000000041c08 R_X86_64_GLOB_DAT dlsym@GLIBC_2.2.5 -0000000000041c30 R_X86_64_GLOB_DAT exit@GLIBC_2.2.5 -00000000000419d8 R_X86_64_GLOB_DAT getcwd@GLIBC_2.2.5 -0000000000041c28 R_X86_64_GLOB_DAT getenv@GLIBC_2.2.5 -00000000000419b8 R_X86_64_GLOB_DAT memchr@GLIBC_2.2.5 -0000000000041908 R_X86_64_GLOB_DAT memmove@GLIBC_2.2.5 -0000000000041c38 R_X86_64_GLOB_DAT mmap@GLIBC_2.2.5 -0000000000041c40 R_X86_64_GLOB_DAT mprotect@GLIBC_2.2.5 -00000000000418f8 R_X86_64_GLOB_DAT munmap@GLIBC_2.2.5 -0000000000041b88 R_X86_64_GLOB_DAT open@GLIBC_2.2.5 -0000000000041c10 R_X86_64_GLOB_DAT open64@GLIBC_2.2.5 -0000000000041b78 R_X86_64_GLOB_DAT poll@GLIBC_2.2.5 -0000000000041b00 R_X86_64_GLOB_DAT posix_memalign@GLIBC_2.2.5 -0000000000041bb8 R_X86_64_GLOB_DAT pthread_attr_destroy@GLIBC_2.2.5 -0000000000041bb0 R_X86_64_GLOB_DAT pthread_attr_getstack@GLIBC_2.2.5 -0000000000041ba8 R_X86_64_GLOB_DAT pthread_getattr_np@GLIBC_2.2.5 -0000000000041ae0 R_X86_64_GLOB_DAT pthread_getspecific@GLIBC_2.2.5 -0000000000041ae8 R_X86_64_GLOB_DAT pthread_key_create@GLIBC_2.2.5 -0000000000041af0 R_X86_64_GLOB_DAT pthread_key_delete@GLIBC_2.2.5 -0000000000041958 R_X86_64_GLOB_DAT pthread_mutex_destroy@GLIBC_2.2.5 -00000000000419c8 R_X86_64_GLOB_DAT pthread_mutex_lock@GLIBC_2.2.5 -0000000000041a18 R_X86_64_GLOB_DAT pthread_mutex_trylock@GLIBC_2.2.5 -00000000000418d0 R_X86_64_GLOB_DAT pthread_mutex_unlock@GLIBC_2.2.5 -0000000000041b50 R_X86_64_GLOB_DAT pthread_rwlock_rdlock@GLIBC_2.2.5 -0000000000041900 R_X86_64_GLOB_DAT pthread_rwlock_unlock@GLIBC_2.2.5 -0000000000041ba0 R_X86_64_GLOB_DAT pthread_self@GLIBC_2.2.5 -0000000000041ad0 R_X86_64_GLOB_DAT pthread_setspecific@GLIBC_2.2.5 -0000000000041c18 R_X86_64_GLOB_DAT readlink@GLIBC_2.2.5 -0000000000041b98 R_X86_64_GLOB_DAT sigaction@GLIBC_2.2.5 -0000000000041a20 R_X86_64_GLOB_DAT sigaltstack@GLIBC_2.2.5 -0000000000041b90 R_X86_64_GLOB_DAT signal@GLIBC_2.2.5 -00000000000419e0 R_X86_64_GLOB_DAT strlen@GLIBC_2.2.5 -0000000000041a30 R_X86_64_GLOB_DAT syscall@GLIBC_2.2.5 -0000000000041a28 R_X86_64_GLOB_DAT sysconf@GLIBC_2.2.5 -0000000000041a00 R_X86_64_GLOB_DAT writev@GLIBC_2.2.5 -0000000000041ce0 R_X86_64_GLOB_DAT _Unwind_DeleteException@GCC_3.0 -0000000000041cd0 R_X86_64_GLOB_DAT _Unwind_GetDataRelBase@GCC_3.0 -0000000000041d08 R_X86_64_GLOB_DAT _Unwind_GetIPInfo@GCC_4.2.0 -0000000000041d00 R_X86_64_GLOB_DAT _Unwind_GetLanguageSpecificData@GCC_3.0 -0000000000041d10 R_X86_64_GLOB_DAT _Unwind_GetRegionStart@GCC_3.0 -0000000000041cd8 R_X86_64_GLOB_DAT _Unwind_GetTextRelBase@GCC_3.0 -0000000000041cf0 R_X86_64_GLOB_DAT _Unwind_RaiseException@GCC_3.0 -0000000000041d18 R_X86_64_GLOB_DAT _Unwind_SetGR@GCC_3.0 -0000000000041d20 R_X86_64_GLOB_DAT _Unwind_SetIP@GCC_3.0 -0000000000041df0 R_X86_64_JUMP_SLOT __cxa_finalize@GLIBC_2.2.5 -0000000000041df8 R_X86_64_JUMP_SLOT _Unwind_Resume@GCC_3.0 -0000000000041e00 R_X86_64_JUMP_SLOT __fxstat64@GLIBC_2.2.5 - - From 754130d25fb07c889ebe57714cd573c4136ac7f3 Mon Sep 17 00:00:00 2001 From: Brendan Hansknecht Date: Fri, 24 Sep 2021 22:03:59 -0700 Subject: [PATCH 4/5] Remove old unused linker tests --- linker/tests/fib/.gitignore | 11 --- linker/tests/fib/Main.roc | 15 ---- linker/tests/fib/README.md | 48 ------------- linker/tests/fib/platform/Package-Config.roc | 10 --- linker/tests/fib/platform/app.zig | 1 - linker/tests/fib/platform/build.zig | 33 --------- linker/tests/fib/platform/host.zig | 73 -------------------- 7 files changed, 191 deletions(-) delete mode 100644 linker/tests/fib/.gitignore delete mode 100644 linker/tests/fib/Main.roc delete mode 100644 linker/tests/fib/README.md delete mode 100644 linker/tests/fib/platform/Package-Config.roc delete mode 100644 linker/tests/fib/platform/app.zig delete mode 100644 linker/tests/fib/platform/build.zig delete mode 100644 linker/tests/fib/platform/host.zig diff --git a/linker/tests/fib/.gitignore b/linker/tests/fib/.gitignore deleted file mode 100644 index a3c0d77f6d..0000000000 --- a/linker/tests/fib/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -fib - -zig-cache -zig-out - -*.o - -dynhost -preprocessedhost -metadata -libapp.so \ No newline at end of file diff --git a/linker/tests/fib/Main.roc b/linker/tests/fib/Main.roc deleted file mode 100644 index 646fdbea75..0000000000 --- a/linker/tests/fib/Main.roc +++ /dev/null @@ -1,15 +0,0 @@ -app "fib" - packages { base: "platform" } - imports [] - provides [ main ] to base - -main : U64 -> U64 -main = \index -> - fibHelp index 0 1 - -fibHelp : U64, U64, U64 -> U64 -fibHelp = \index, parent, grandparent -> - if index == 0 then - parent - else - fibHelp (index - 1) grandparent (parent + grandparent) \ No newline at end of file diff --git a/linker/tests/fib/README.md b/linker/tests/fib/README.md deleted file mode 100644 index 0f1af10077..0000000000 --- a/linker/tests/fib/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# Hello, World! - -To run, `cd` into this directory and run: - -```bash -$ cargo run Hello.roc -``` - -To run in release mode instead, do: - -```bash -$ cargo run --release Hello.roc -``` - -## Troubleshooting - -If you encounter `cannot find -lc++`, run the following for ubuntu `sudo apt install libc++-dev`. - -## Design Notes - -This demonstrates the basic design of hosts: Roc code gets compiled into a pure -function (in this case, a thunk that always returns `"Hello, World!"`) and -then the host calls that function. Fundamentally, that's the whole idea! The host -might not even have a `main` - it could be a library, a plugin, anything. -Everything else is built on this basic "hosts calling linked pure functions" design. - -For example, things get more interesting when the compiled Roc function returns -a `Task` - that is, a tagged union data structure containing function pointers -to callback closures. This lets the Roc pure function describe arbitrary -chainable effects, which the host can interpret to perform I/O as requested by -the Roc program. (The tagged union `Task` would have a variant for each supported -I/O operation.) - -In this trivial example, it's very easy to line up the API between the host and -the Roc program. In a more involved host, this would be much trickier - especially -if the API were changing frequently during development. - -The idea there is to have a first-class concept of "glue code" which host authors -can write (it would be plain Roc code, but with some extra keywords that aren't -available in normal modules - kinda like `port module` in Elm), and which -describe both the Roc-host/C boundary as well as the Roc-host/Roc-app boundary. -Roc application authors only care about the Roc-host/Roc-app portion, and the -host author only cares about the Roc-host/C boundary when implementing the host. - -Using this glue code, the Roc compiler can generate C header files describing the -boundary. This not only gets us host compatibility with C compilers, but also -Rust FFI for free, because [`rust-bindgen`](https://github.com/rust-lang/rust-bindgen) -generates correct Rust FFI bindings from C headers. diff --git a/linker/tests/fib/platform/Package-Config.roc b/linker/tests/fib/platform/Package-Config.roc deleted file mode 100644 index d93cd7c258..0000000000 --- a/linker/tests/fib/platform/Package-Config.roc +++ /dev/null @@ -1,10 +0,0 @@ -platform tests/fib - requires {}{ main : U64 -> U64 } - exposes [] - packages {} - imports [] - provides [ mainForHost ] - effects fx.Effect {} - -mainForHost : U64 -> U64 -mainForHost = \arg -> main arg # workaround for https://github.com/rtfeldman/roc/issues/1622 \ No newline at end of file diff --git a/linker/tests/fib/platform/app.zig b/linker/tests/fib/platform/app.zig deleted file mode 100644 index 105908633f..0000000000 --- a/linker/tests/fib/platform/app.zig +++ /dev/null @@ -1 +0,0 @@ -export fn roc__mainForHost_1_exposed(_i: i64, _result: *u64) void {} diff --git a/linker/tests/fib/platform/build.zig b/linker/tests/fib/platform/build.zig deleted file mode 100644 index deb36d6c78..0000000000 --- a/linker/tests/fib/platform/build.zig +++ /dev/null @@ -1,33 +0,0 @@ -const Builder = @import("std").build.Builder; - -pub fn build(b: *Builder) void { - // Standard target options allows the person running `zig build` to choose - // what target to build for. Here we do not override the defaults, which - // means any target is allowed, and the default is native. Other options - // for restricting supported target set are available. - const target = b.standardTargetOptions(.{}); - - // Standard release options allow the person running `zig build` to select - // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. - const mode = b.standardReleaseOptions(); - - const app = b.addSharedLibrary("app", "app.zig", .unversioned); - app.setTarget(target); - app.setBuildMode(mode); - app.install(); - - const exe = b.addExecutable("dynhost", "host.zig"); - exe.pie = true; - exe.strip = true; - exe.setTarget(target); - exe.setBuildMode(mode); - exe.linkLibrary(app); - exe.linkLibC(); - exe.install(); - - const run_cmd = exe.run(); - run_cmd.step.dependOn(b.getInstallStep()); - - const run_step = b.step("run", "Run the app"); - run_step.dependOn(&run_cmd.step); -} diff --git a/linker/tests/fib/platform/host.zig b/linker/tests/fib/platform/host.zig deleted file mode 100644 index c439c889c7..0000000000 --- a/linker/tests/fib/platform/host.zig +++ /dev/null @@ -1,73 +0,0 @@ -const std = @import("std"); -const testing = std.testing; -const expectEqual = testing.expectEqual; -const expect = testing.expect; - -comptime { - // This is a workaround for https://github.com/ziglang/zig/issues/8218 - // which is only necessary on macOS. - // - // Once that issue is fixed, we can undo the changes in - // 177cf12e0555147faa4d436e52fc15175c2c4ff0 and go back to passing - // -fcompiler-rt in link.rs instead of doing this. Note that this - // workaround is present in many host.zig files, so make sure to undo - // it everywhere! - if (std.builtin.os.tag == .macos) { - _ = @import("compiler_rt"); - } -} - -extern fn malloc(size: usize) callconv(.C) ?*c_void; -extern fn realloc(c_ptr: [*]align(@alignOf(u128)) u8, size: usize) callconv(.C) ?*c_void; -extern fn free(c_ptr: [*]align(@alignOf(u128)) u8) callconv(.C) void; - -export fn roc_alloc(size: usize, alignment: u32) callconv(.C) ?*c_void { - return malloc(size); -} - -export fn roc_realloc(c_ptr: *c_void, old_size: usize, new_size: usize, alignment: u32) callconv(.C) ?*c_void { - return realloc(@alignCast(16, @ptrCast([*]u8, c_ptr)), new_size); -} - -export fn roc_dealloc(c_ptr: *c_void, alignment: u32) callconv(.C) void { - free(@alignCast(16, @ptrCast([*]u8, c_ptr))); -} - -export fn roc_panic(c_ptr: *c_void, tag_id: u32) callconv(.C) void { - const stderr = std.io.getStdErr().writer(); - const msg = @ptrCast([*:0]const u8, c_ptr); - stderr.print("Application crashed with message\n\n {s}\n\nShutting down\n", .{msg}) catch unreachable; - std.process.exit(0); -} - -const mem = std.mem; -const Allocator = mem.Allocator; - -extern fn roc__mainForHost_1_exposed(i64, *i64) void; - -const Unit = extern struct {}; - -pub export fn main() u8 { - const stdout = std.io.getStdOut().writer(); - const fib_number_to_find: u64 = 10; // find the nth Fibonacci number - const iterations: usize = 50; // number of times to repeatedly find that Fibonacci number - - // make space for the result - var callresult = 0; - var remaining_iterations = iterations; - - while (remaining_iterations > 0) { - // actually call roc to populate the callresult - roc__mainForHost_1_exposed(fib_number_to_find, &callresult); - - remaining_iterations -= 1; - } - - // stdout the final result - stdout.print( - "After calling the Roc app {d} times, the Fibonacci number at index {d} is {d}\n", - .{ iterations, fib_number_to_find, callresult }, - ) catch unreachable; - - return 0; -} From e6c137889a552f6f2c0ff408cbe7e63331b9e921 Mon Sep 17 00:00:00 2001 From: Brendan Hansknecht Date: Sat, 25 Sep 2021 12:19:56 -0700 Subject: [PATCH 5/5] Just disable gc-sections with surgical linker for rust hosts for now --- compiler/build/src/link.rs | 1 + examples/cli/platform/src/lib.rs | 2 +- examples/cli/platform/src/main.rs | 63 +----------------------- examples/hello-rust/platform/src/lib.rs | 3 +- examples/hello-rust/platform/src/main.rs | 50 +------------------ linker/README.md | 4 +- 6 files changed, 8 insertions(+), 115 deletions(-) diff --git a/compiler/build/src/link.rs b/compiler/build/src/link.rs index 4764493911..32c8a4c9f6 100644 --- a/compiler/build/src/link.rs +++ b/compiler/build/src/link.rs @@ -385,6 +385,7 @@ pub fn rebuild_host( command.arg("--release"); } let source_file = if shared_lib_path.is_some() { + command.env("RUSTFLAGS", "-C link-dead-code"); command.args(&["--bin", "host"]); "src/main.rs" } else { diff --git a/examples/cli/platform/src/lib.rs b/examples/cli/platform/src/lib.rs index d313d6f424..d316e264d8 100644 --- a/examples/cli/platform/src/lib.rs +++ b/examples/cli/platform/src/lib.rs @@ -70,7 +70,7 @@ pub unsafe extern "C" fn roc_memset(dst: *mut c_void, c: i32, n: usize) -> *mut } #[no_mangle] -pub extern "C" fn rust_main() -> isize { +pub extern "C" fn rust_main() -> i32 { let size = unsafe { roc_main_size() } as usize; let layout = Layout::array::(size).unwrap(); diff --git a/examples/cli/platform/src/main.rs b/examples/cli/platform/src/main.rs index 0d2ec6edb1..51175f934b 100644 --- a/examples/cli/platform/src/main.rs +++ b/examples/cli/platform/src/main.rs @@ -1,64 +1,3 @@ -#![allow(non_snake_case)] - -use core::ffi::c_void; -use roc_std::RocStr; - fn main() { - let mut result = host::rust_main(); - // This is stupid code that does nothing to avoid rust optimizing functions that roc needs away. - if result == 0x1234_5678_9ABC_DEF0 { - let roc_alloc_ptr: isize = unsafe { - std::mem::transmute( - host::roc_alloc as *const unsafe extern "C" fn(usize, u32) -> *mut c_void, - ) - }; - let roc_realloc_ptr: isize = unsafe { - std::mem::transmute( - host::roc_realloc - as *const unsafe extern "C" fn(*mut c_void, usize, usize, u32) -> *mut c_void, - ) - }; - let roc_dealloc_ptr: isize = unsafe { - std::mem::transmute(host::roc_dealloc as *const unsafe extern "C" fn(*mut c_void, u32)) - }; - let roc_panic_ptr: isize = unsafe { - std::mem::transmute(host::roc_panic as *const unsafe extern "C" fn(*mut c_void, u32)) - }; - let roc_memcpy_ptr: isize = unsafe { - std::mem::transmute( - host::roc_memcpy - as *const unsafe extern "C" fn(*mut c_void, *mut c_void, usize) -> *mut c_void, - ) - }; - let roc_memset_ptr: isize = unsafe { - std::mem::transmute( - host::roc_memset - as *const unsafe extern "C" fn(*mut c_void, i32, usize) -> *mut c_void, - ) - }; - let roc_fx_putLine_ptr: isize = unsafe { - std::mem::transmute(host::roc_fx_putLine as *const extern "C" fn(line: RocStr) -> ()) - }; - let roc_fx_getLine_ptr: isize = unsafe { - std::mem::transmute(host::roc_fx_getLine as *const extern "C" fn() -> RocStr) - }; - // I really want to use the equivalent of std::hint::black_box, but it is expirimental. - result = result ^ roc_alloc_ptr; - result = result ^ roc_realloc_ptr; - result = result ^ roc_dealloc_ptr; - result = result ^ roc_panic_ptr; - result = result ^ roc_memcpy_ptr; - result = result ^ roc_memset_ptr; - result = result ^ roc_fx_putLine_ptr; - result = result ^ roc_fx_getLine_ptr; - result = result ^ roc_alloc_ptr; - result = result ^ roc_realloc_ptr; - result = result ^ roc_dealloc_ptr; - result = result ^ roc_panic_ptr; - result = result ^ roc_memcpy_ptr; - result = result ^ roc_memset_ptr; - result = result ^ roc_fx_putLine_ptr; - result = result ^ roc_fx_getLine_ptr; - } - std::process::exit(result as i32); + std::process::exit(host::rust_main()); } diff --git a/examples/hello-rust/platform/src/lib.rs b/examples/hello-rust/platform/src/lib.rs index d81192b939..341556bb4b 100644 --- a/examples/hello-rust/platform/src/lib.rs +++ b/examples/hello-rust/platform/src/lib.rs @@ -1,7 +1,6 @@ #![allow(non_snake_case)] use core::ffi::c_void; -use core::mem::MaybeUninit; use libc::c_char; use roc_std::RocStr; use std::ffi::CStr; @@ -55,7 +54,7 @@ pub unsafe extern "C" fn roc_memset(dst: *mut c_void, c: i32, n: usize) -> *mut } #[no_mangle] -pub extern "C" fn rust_main() -> isize { +pub extern "C" fn rust_main() -> i32 { unsafe { let roc_str = roc_main(); diff --git a/examples/hello-rust/platform/src/main.rs b/examples/hello-rust/platform/src/main.rs index 49cefd692f..51175f934b 100644 --- a/examples/hello-rust/platform/src/main.rs +++ b/examples/hello-rust/platform/src/main.rs @@ -1,51 +1,3 @@ -use core::ffi::c_void; - fn main() { - let mut result = host::rust_main(); - // This is stupid code that does nothing to avoid rust optimizing functions that roc needs away. - if result == 0x1234_5678_9ABC_DEF0 { - let roc_alloc_ptr: isize = unsafe { - std::mem::transmute( - host::roc_alloc as *const unsafe extern "C" fn(usize, u32) -> *mut c_void, - ) - }; - let roc_realloc_ptr: isize = unsafe { - std::mem::transmute( - host::roc_realloc - as *const unsafe extern "C" fn(*mut c_void, usize, usize, u32) -> *mut c_void, - ) - }; - let roc_dealloc_ptr: isize = unsafe { - std::mem::transmute(host::roc_dealloc as *const unsafe extern "C" fn(*mut c_void, u32)) - }; - let roc_panic_ptr: isize = unsafe { - std::mem::transmute(host::roc_panic as *const unsafe extern "C" fn(*mut c_void, u32)) - }; - let roc_memcpy_ptr: isize = unsafe { - std::mem::transmute( - host::roc_memcpy - as *const unsafe extern "C" fn(*mut c_void, *mut c_void, usize) -> *mut c_void, - ) - }; - let roc_memset_ptr: isize = unsafe { - std::mem::transmute( - host::roc_memset - as *const unsafe extern "C" fn(*mut c_void, i32, usize) -> *mut c_void, - ) - }; - // I really want to use the equivalent of std::hint::black_box, but it is expirimental. - result = result ^ roc_alloc_ptr; - result = result ^ roc_realloc_ptr; - result = result ^ roc_dealloc_ptr; - result = result ^ roc_panic_ptr; - result = result ^ roc_memcpy_ptr; - result = result ^ roc_memset_ptr; - result = result ^ roc_alloc_ptr; - result = result ^ roc_realloc_ptr; - result = result ^ roc_dealloc_ptr; - result = result ^ roc_panic_ptr; - result = result ^ roc_memcpy_ptr; - result = result ^ roc_memset_ptr; - } - std::process::exit(result as i32); + std::process::exit(host::rust_main()); } diff --git a/linker/README.md b/linker/README.md index 150eef59d3..e5342c64ea 100644 --- a/linker/README.md +++ b/linker/README.md @@ -31,7 +31,6 @@ This linker is run in 2 phases: preprocessing and surigical linking. ## TODO (In a lightly prioritized order) -- Try to make rust hosts nicer. Currently making it expose functions is a huge pain. - Add Macho support - Honestly should be almost exactly the same code. This means we likely need to do a lot of refactoring to minimize the duplicate code. @@ -40,4 +39,7 @@ This linker is run in 2 phases: preprocessing and surigical linking. - As a prereq, we need roc building on Windows (I'm not sure it does currently). - Definitely a solid bit different than elf, but hopefully after refactoring for Macho, won't be that crazy to add. - Look at enabling completely in memory linking that could be used with `roc run` and/or `roc repl` +- Look more into roc hosts and keeping certain functions. Currently I just disabled linker garbage collection. + This works but adds 1.2MB (40%) to even a tiny app. It may be a size issue for large rust hosts. + Roc, for reference, adds 13MB (20%) when linked without garbage collection. - Add a feature to the compiler to make this linker optional.