Gol*_*nks 6 static-linking rust rust-cargo musl
我有一个依赖于Hyper和Diesel的项目,因此,在本机库OpenSSL和libpq上.该项目建立在每晚Rust上,因为它使用编译器插件.
我目前的尝试是建立在Docker容器上.我有MUSL libc和库make'd并安装了前缀/usr/local/musl.我cargo使用以下命令运行:(不确定某些选项是否冗余,我不太熟悉编译器链,甚至不确定它们是否最终到链接器,但我必须尝试,对.)
LDFLAGS="-static -L/usr/local/musl/lib" \
LD_LIBRARY_PATH=/usr/local/musl/lib:$LD_LIBRARY_PATH \
CFLAGS="-I/usr/local/musl/include" \
PKG_CONFIG_PATH=/usr/local/musl/lib/pkgconfig \
cargo build --release --target=x86_64-unknown-linux-musl
Run Code Online (Sandbox Code Playgroud)
当我ldd得到的文件,它揭示了这个:
$ ldd server
linux-vdso.so.1 (0x00007fffb878e000)
libpq.so.5 => /usr/local/musl/lib/libpq.so.5 (0x00007f4d730e7000)
libssl.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007f4d72e82000)
libcrypto.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007f4d72a85000)
libc.so => /usr/local/musl/lib/libc.so (0x00007f4d727f6000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f4d725f2000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4d72246000)
/lib/ld64.so.1 => /lib64/ld-linux-x86-64.so.2 (0x000055e2124a2000)
Run Code Online (Sandbox Code Playgroud)
有所有动态链接的东西,有些甚至与"x86_64-linux-gnu"链!什么地方出了错?
我可以毫无问题地制作静态链接,简单的纯Rust项目.ldd说它们是静态链接的,它们运行没有问题,不像我遇到问题的可执行文件.
当我使用--verbose与货物,我得到了下面rustc的命令,即实际编制的可执行文件:http://pastebin.com/ywv0zNBK(哎呀,这人有一个自定义的outdir和-Z print-link-args,由我添加)添加print-link-args标志,我得到了下面的链接器命令:http://pastebin.com/Aw43qd7h
我如何得到cargo或rustc相信我想要一个静态二进制文件?
Arn*_*len 18
如果你想静态链接一个没有本机依赖的 Rust 程序,那就容易得多:
$ rustup target add x86_64-unknown-linux-musl
$ cargo build --release --target=x86_64-unknown-linux-musl
Run Code Online (Sandbox Code Playgroud)
问题是,对于提供本机依赖的每个箱子 - 比如说OpenSSL--有一个build.rs构建脚本负责将构建和链接选项传递给Cargo和rustc.(例如:他们打印出类似cargo:rustc-link-lib=static=ssl货物然后读取并相应地行动的东西.)
因此,仅设置"标准"GCC环境变量几乎不会产生任何影响.您必须分别检查每一个,build.rs以了解如何强制确切的箱子来传达货物的选择.对于OpenSSL,它是env vars之类的OPENSSL_DIR,OPENSSL_STATIC等等.
另一个障碍是,如果你使用编译器插件,它们也可能使用目标三元组编译(至少是docker_codegen).另一方面,它们在编译过程中动态链接.这意味着不仅必须正确链接静态库,还必须具有目标变体的动态库,如MUSL libc.so,并正确设置(LD_LIBRARY_PATH等等).
我做了一个彻底评论的Dockerfile,它使用一些本机依赖项静态地构建我的项目.它也可能对其他人有所帮助.
https://github.com/golddranks/rust_musl_docker/blob/master/Dockerfile.template
| 归档时间: |
|
| 查看次数: |
2770 次 |
| 最近记录: |