mirror of
https://github.com/edg-l/edlang.git
synced 2024-11-22 16:08:24 +00:00
fix(linker): fix linker on distros like ubuntu
This commit is contained in:
parent
84257b6cc7
commit
dd671afd54
|
@ -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(())
|
||||
}
|
||||
|
||||
fn file_exists(path: &str) -> bool {
|
||||
Path::new(path).exists()
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue