【问题标题】:Why is a Rust app binary "dynamically linked"?为什么 Rust 应用程序二进制文件是“动态链接的”?
【发布时间】:2021-11-24 02:21:09
【问题描述】:

我很好奇,决定在我为 Linux (Ubuntu 20.04) 编译的 Rust 应用程序上运行 file 命令。为什么可执行文件“动态链接”?我虽然默认情况下 Rust 二进制文件是静态链接的。

$ file my_hello_world_app
my_hello_world_app: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[xxHash]=5ddb20be333a274e, with debug_info, not stripped

我测试了几个 Rust bin 应用程序,最后一个是通过 cargo new ... 创建的全新 hello-world 应用程序,并简单地使用 cargo build --release 构建。我还测试了两个不同的链接器:默认链接器和 LLD。在所有情况下,file 命令都显示为“动态链接”。

【问题讨论】:

    标签: rust linker


    【解决方案1】:

    Rust 仍然链接到 GNU lib c,不鼓励静态链接 gnu libc:Why is statically linking glibc discouraged?

    $ ldd target/release/hello
            linux-vdso.so.1 (0x00007ffd4c1ed000)
            libgcc_s.so.1 => /nix/store/v8q6nxyppy1myi3rxni2080bv8s9jxiy-glibc-2.32-40/lib/libgcc_s.so.1 (0x00007f24c760e000)
            libpthread.so.0 => /nix/store/v8q6nxyppy1myi3rxni2080bv8s9jxiy-glibc-2.32-40/lib/libpthread.so.0 (0x00007f24c75ed000)
            libm.so.6 => /nix/store/v8q6nxyppy1myi3rxni2080bv8s9jxiy-glibc-2.32-40/lib/libm.so.6 (0x00007f24c74aa000)
            libdl.so.2 => /nix/store/v8q6nxyppy1myi3rxni2080bv8s9jxiy-glibc-2.32-40/lib/libdl.so.2 (0x00007f24c74a5000)
            libc.so.6 => /nix/store/v8q6nxyppy1myi3rxni2080bv8s9jxiy-glibc-2.32-40/lib/libc.so.6 (0x00007f24c72e4000)
            /nix/store/v8q6nxyppy1myi3rxni2080bv8s9jxiy-glibc-2.32-40/lib/ld-linux-x86-64.so.2 => /nix/store/gk42f59363p82rg2wv2mfy71jn5w4q4c-glibc-2.32-48/lib64/ld-linux-x86-64.so.2 (0x00007f24c766f000)
    

    所以静态链接 glibc 将是一个糟糕的默认选择。

    你可以完全静态地链接你的 rust 程序,最简单的可能是只使用 musl 目标(至少在 linux 上):

    $ cargo build --target x86_64-unknown-linux-musl --release
        Finished release [optimized] target(s) in 0.00s
    
    $ ldd target/x86_64-unknown-linux-musl/release/hello
            statically linked
    

    但是你在这里又开了一罐虫子:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-15
      • 2015-02-27
      • 2012-12-08
      • 2020-11-15
      • 1970-01-01
      • 2013-05-24
      • 2015-03-29
      相关资源
      最近更新 更多