为什么Rust编译生成的Linux应用二进制文件是动态链接的?
Rust Linux环境下默认动态链接的原因说明
Rust在Linux使用GNU工具链的场景下,默认并不是完全静态链接的,你观察到的dynamically linked结果属于正常现象,具体逻辑如下:
- Rust默认编译使用
x86_64-unknown-linux-gnu目标时,仅会静态嵌入Rust标准库和所有Rust项目依赖的代码,系统C标准库(glibc)默认采用动态链接策略。这是官方出于兼容性考虑的设计:glibc静态链接存在大量适配问题,比如名称服务切换(NSS)相关功能失效、不同内核版本的系统调用兼容问题等,动态链接系统预装的glibc稳定性更高。 - 你可以通过
ldd 你的二进制文件名验证这一点,输出的动态依赖只会包含glibc相关的so文件,不会出现Rust标准库的动态依赖。 - 你测试默认链接器和LLD结果一致的原因是:两种链接器都是遵循GNU目标的默认链接规则,不会改变glibc的动态链接策略。
如果你需要生成完全静态链接的二进制文件,可以切换到musl目标编译,操作步骤如下:
- 安装musl编译目标:
rustup target add x86_64-unknown-linux-musl - 编译时指定musl目标:
cargo build --release --target x86_64-unknown-linux-musl
编译完成后生成的二进制文件执行file命令就会显示statically linked。
内容的提问来源于stack exchange,提问作者at54321
相关产品推荐
相关产品推荐

