Skip to content

Commit

Permalink
fix(linker): fix linker on distros like ubuntu
Browse files Browse the repository at this point in the history
  • Loading branch information
edg-l committed Feb 14, 2024
1 parent 84257b6 commit dd671af
Showing 1 changed file with 32 additions and 34 deletions.
66 changes: 32 additions & 34 deletions lib/edlang_codegen_llvm/src/linker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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")]
{
Expand All @@ -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(),
]
}
Expand All @@ -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<dyn std::error::Error>> {
let args: &[&str] = {
#[cfg(target_os = "macos")]
{
Expand All @@ -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",
Expand All @@ -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(),
]
}
Expand All @@ -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()
}

0 comments on commit dd671af

Please sign in to comment.