diff --git a/lib/edlang_codegen_llvm/src/linker.rs b/lib/edlang_codegen_llvm/src/linker.rs index b44df1718c..b456496d23 100644 --- a/lib/edlang_codegen_llvm/src/linker.rs +++ b/lib/edlang_codegen_llvm/src/linker.rs @@ -3,7 +3,10 @@ use std::path::Path; use tracing::instrument; #[instrument(level = "debug")] -pub fn link_shared_lib(input_path: &Path, output_filename: &Path) -> Result<(), std::io::Error> { +pub fn link_shared_lib( + input_path: &Path, + output_filename: &Path, +) -> Result<(), Box> { let args: &[&str] = { #[cfg(target_os = "macos")] { @@ -22,41 +25,15 @@ pub fn link_shared_lib(input_path: &Path, output_filename: &Path) -> Result<(), } #[cfg(target_os = "linux")] { - let (scrt1, crti, crtn) = { - if file_exists("/usr/lib64/Scrt1.o") { - ( - "/usr/lib64/Scrt1.o", - "/usr/lib64/crti.o", - "/usr/lib64/crtn.o", - ) - } else { - ( - "/lib/x86_64-linux-gnu/Scrt1.o", - "/lib/x86_64-linux-gnu/crti.o", - "/lib/x86_64-linux-gnu/crtn.o", - ) - } - }; - &[ - "-pie", "--hash-style=gnu", "--eh-frame-hdr", - "--dynamic-linker", - "/lib64/ld-linux-x86-64.so.2", - "-m", - "elf_x86_64", - scrt1, - crti, + "-shared", "-o", &output_filename.display().to_string(), - "-L/lib64", - "-L/usr/lib64", - "-L/lib/x86_64-linux-gnu", - "-zrelro", - "--no-as-needed", + "-L/lib/../lib64", + "-L/usr/lib/../lib64", "-lc", - crtn, &input_path.display().to_string(), ] } @@ -73,7 +50,10 @@ pub fn link_shared_lib(input_path: &Path, output_filename: &Path) -> Result<(), } #[instrument(level = "debug")] -pub fn link_binary(input_path: &Path, output_filename: &Path) -> Result<(), std::io::Error> { +pub fn link_binary( + input_path: &Path, + output_filename: &Path, +) -> Result<(), Box> { let args: &[&str] = { #[cfg(target_os = "macos")] { @@ -88,6 +68,22 @@ pub fn link_binary(input_path: &Path, output_filename: &Path) -> Result<(), std: } #[cfg(target_os = "linux")] { + let (scrt1, crti, crtn) = { + if file_exists("/usr/lib64/Scrt1.o") { + ( + "/usr/lib64/Scrt1.o", + "/usr/lib64/crti.o", + "/usr/lib64/crtn.o", + ) + } else { + ( + "/lib/x86_64-linux-gnu/Scrt1.o", + "/lib/x86_64-linux-gnu/crti.o", + "/lib/x86_64-linux-gnu/crtn.o", + ) + } + }; + &[ "-pie", "--hash-style=gnu", @@ -96,16 +92,17 @@ pub fn link_binary(input_path: &Path, output_filename: &Path) -> Result<(), std: "/lib64/ld-linux-x86-64.so.2", "-m", "elf_x86_64", - "/usr/lib64/Scrt1.o", - "/usr/lib64/crti.o", + scrt1, + crti, "-o", &output_filename.display().to_string(), "-L/lib64", "-L/usr/lib64", + "-L/lib/x86_64-linux-gnu", "-zrelro", "--no-as-needed", "-lc", - "/usr/lib64/crtn.o", + crtn, &input_path.display().to_string(), ] } @@ -121,6 +118,7 @@ pub fn link_binary(input_path: &Path, output_filename: &Path) -> Result<(), std: Ok(()) } +#[cfg(target_os = "linux")] fn file_exists(path: &str) -> bool { Path::new(path).exists() }