【问题标题】:How to generate statically linked executables?如何生成静态链接的可执行文件?
【发布时间】:2015-10-24 13:48:08
【问题描述】:

我正在尝试使用 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 同意的也是静态链接的)。

【问题讨论】:

  • 也许 -C link-args='...' 选项可以帮助你?
  • 请注意,您的问题仅适用于 Linux - AFAIK,you cannot statically link executables on OS X。我不确定 Windows。
  • 这个internals thread 可能也很有趣。它也指向 musl。
  • @Mikhail,我不知道其他系统的确切细节,但在 linux 上(并给予或接受大多数其他 unix 的寄存器分配)print 触底(通过函数调用或内联)到mov eax,1 ; mov ebx,fdout ; mov ecx bufptr ; mov edx buflen。设计一个真正需要动态链接的系统调用接口可能可能,但对于通用操作系统,只有极度无能的人才会这样做。

标签: rust static-linking


【解决方案1】:

Rust 默认静态链接除 glibc(和 libgcc、iirc)之外的所有内容。

如果您想获得 100% 静态链接的二进制文件,您可以使用 MUSL 和 1.1。 https://github.com/rust-lang/rust/pull/24777 是初步支持,希望以后能更好用。

【讨论】:

  • 在 2019 年,musl仍然是获得 100% 静态链接二进制文件的唯一方法吗?我们现在可以使用glibc 获得 100% 静态链接的二进制文件吗?
  • 我不相信 glibc 真的打算将它作为一流的东西来支持它,尽管我可能是错的。
  • 嗨,史蒂夫,2021 年入住;根据您的“我们希望将来让它变得更容易”,是否有任何更新可以让这更容易?
  • 现在是通过 rustup 分发的,所以你可以“rustup target add x86_64-unknown-linux-musl”然后“cargo build --target=x86_64-unknown-linux-musl”
  • @SteveKlabnik 老实说应该是它自己的答案!谢谢。
【解决方案2】:

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。

另见:

【讨论】:

猜你喜欢
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 2015-04-16
  • 2018-04-17
  • 2010-12-16
相关资源
最近更新 更多