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;
|
use tracing::instrument;
|
||||||
|
|
||||||
#[instrument(level = "debug")]
|
#[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] = {
|
let args: &[&str] = {
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
{
|
{
|
||||||
|
@ -21,6 +24,49 @@ pub fn link_shared_lib(input_path: &Path, output_filename: &Path) -> Result<(),
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
#[cfg(target_os = "linux")]
|
#[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) = {
|
let (scrt1, crti, crtn) = {
|
||||||
if file_exists("/usr/lib64/Scrt1.o") {
|
if file_exists("/usr/lib64/Scrt1.o") {
|
||||||
|
@ -72,55 +118,7 @@ pub fn link_shared_lib(input_path: &Path, output_filename: &Path) -> Result<(),
|
||||||
Ok(())
|
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")]
|
#[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 {
|
fn file_exists(path: &str) -> bool {
|
||||||
Path::new(path).exists()
|
Path::new(path).exists()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue