fix(linker): fix linker on distros like ubuntu

This commit is contained in:
Edgar 2024-02-14 09:02:36 +01:00
parent 84257b6cc7
commit dd671afd54
No known key found for this signature in database
GPG key ID: 70ADAE8F35904387

View file

@ -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<dyn std::error::Error>> {
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<dyn std::error::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")]
{
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()
}