From dd671afd549b87639dd9b1c2703c8ca85b3b7c0f Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Wed, 14 Feb 2024 09:02:36 +0100 Subject: [PATCH] fix(linker): fix linker on distros like ubuntu --- lib/edlang_codegen_llvm/src/linker.rs | 98 +++++++++++++-------------- 1 file changed, 48 insertions(+), 50 deletions(-) diff --git a/lib/edlang_codegen_llvm/src/linker.rs b/lib/edlang_codegen_llvm/src/linker.rs index b44df1718..b456496d2 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")] { @@ -21,6 +24,49 @@ pub fn link_shared_lib(input_path: &Path, output_filename: &Path) -> Result<(), ] } #[cfg(target_os = "linux")] + { + &[ + "--hash-style=gnu", + "--eh-frame-hdr", + "-shared", + "-o", + &output_filename.display().to_string(), + "-L/lib/../lib64", + "-L/usr/lib/../lib64", + "-lc", + &input_path.display().to_string(), + ] + } + #[cfg(target_os = "windows")] + { + unimplemented!() + } + }; + + let mut linker = std::process::Command::new("ld"); + let proc = linker.args(args.iter()).spawn()?; + proc.wait_with_output()?; + Ok(()) +} + +#[instrument(level = "debug")] +pub fn link_binary( + input_path: &Path, + output_filename: &Path, +) -> Result<(), Box> { + let args: &[&str] = { + #[cfg(target_os = "macos")] + { + &[ + "-L/usr/local/lib", + "-L/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib", + &input_path.display().to_string(), + "-o", + &output_filename.display().to_string(), + "-lSystem", + ] + } + #[cfg(target_os = "linux")] { let (scrt1, crti, crtn) = { if file_exists("/usr/lib64/Scrt1.o") { @@ -72,55 +118,7 @@ pub fn link_shared_lib(input_path: &Path, output_filename: &Path) -> Result<(), Ok(()) } -#[instrument(level = "debug")] -pub fn link_binary(input_path: &Path, output_filename: &Path) -> Result<(), std::io::Error> { - let args: &[&str] = { - #[cfg(target_os = "macos")] - { - &[ - "-L/usr/local/lib", - "-L/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib", - &input_path.display().to_string(), - "-o", - &output_filename.display().to_string(), - "-lSystem", - ] - } - #[cfg(target_os = "linux")] - { - &[ - "-pie", - "--hash-style=gnu", - "--eh-frame-hdr", - "--dynamic-linker", - "/lib64/ld-linux-x86-64.so.2", - "-m", - "elf_x86_64", - "/usr/lib64/Scrt1.o", - "/usr/lib64/crti.o", - "-o", - &output_filename.display().to_string(), - "-L/lib64", - "-L/usr/lib64", - "-zrelro", - "--no-as-needed", - "-lc", - "/usr/lib64/crtn.o", - &input_path.display().to_string(), - ] - } - #[cfg(target_os = "windows")] - { - unimplemented!() - } - }; - - let mut linker = std::process::Command::new("ld"); - let proc = linker.args(args.iter()).spawn()?; - proc.wait_with_output()?; - Ok(()) -} - +#[cfg(target_os = "linux")] fn file_exists(path: &str) -> bool { Path::new(path).exists() }