如何生成静态链接的可执行文件?

时间:2015-08-02 09:45:08

标签: rust static-linking

我正在尝试使用Rust创建一个静态可执行文件。我试图静态链接特定的库,我正在尝试创建一个根本不使用动态链接的可执行文件。我有以下(否则正在工作)测试:

$ cat hello.rs
fn main()
    {
    print!("Hello, world!\n");
    }
$ rustc hello.rs -o hello
$ file hello
hello: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV),
 dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, [etc]

请注意dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2。静态可执行文件改为statically linked。 (在我的情况下corrupted section header size,如果我能说服Rust复制 ,我会感到非常惊讶。)

我需要将哪些选项传递给rustc以使其生成实际的静态可执行文件(具体:偶数file同意的是静态链接的。)

2 个答案:

答案 0 :(得分:18)

默认情况下,Rust会静态链接除glibc(和libgcc,iirc)之外的所有内容。

如果要获得100%静态链接的二进制文件,可以使用MUSL和1.1。 https://github.com/rust-lang/rust/pull/24777是最初的支持,我们希望将来更容易使用。

答案 1 :(得分:12)

Since Rust 1.19,您可以静态链接C运行时(CRT)以避免在Windows上出现这种非常常见的情况:

  

程序无法启动,因为您的VCRUNTIME140.dll丢失了   电脑。尝试重新安装该程序以解决此问题。

使用您平台的相应目标三元组将其添加到您的.cargo/config文件中:

[target.x86_64-pc-windows-msvc]
rustflags = ["-C", "target-feature=+crt-static"]

编辑.cargo/config的另一种方法是手动将-C target-feature=+crt-static传递给rustc。

另见: