问题描述
我正在尝试使用MUSL静态构建我的rust应用程序。
我的应用程序使用sqlcipher。这意味着静态构建的可执行文件必须包含openssl和sqlcipher C库。
我正在使用https://github.com/emk/rust-musl-builder,所以我写了一个Dockerfile
,以他们的dockerfile开头,该文件已经提供了MUSL环境,其中包括静态构建的启用musl的openssl。
因此,“我所需要的”只是先构建sqlcipher,然后构建我的rust应用程序。不幸的是,这对我来说非常复杂。
这是我当前的docker文件:
FROM ekidd/rust-musl-builder
# sqlcipher requirements
ENV TZ=Europe/Ljubljana
RUN sudo sh -c "ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone"
RUN sudo apt update
RUN sudo apt install tcl -y
# sqlcipher
RUN VERS=4.4.1 && \
cd /home/rust/libs && \
curl -LO https://github.com/sqlcipher/sqlcipher/archive/v$VERS.tar.gz && \
tar xzf v$VERS.tar.gz && cd sqlcipher-$VERS && \
CC=musl-gcc ./configure --host=x86_64-pc-linux-gnu --target=x86_64-linux-musl --prefix=/usr/local/musl --disable-tcl --disable-shared --with-crypto-lib=none --enable-static=yes --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC -DSQLCIPHER_CRYPTO_OPENSSL -I/usr/include/x86_64-linux-musl -I/usr/local/musl/include -I/usr/local/musl/include/openssl" LDFLAGS=" /usr/local/musl/lib/libcrypto.a" && \
make && sudo make install && \
cd .. && rm -rf v$VERS.tar.gz sqlcipher-$VERS
# bring in my rust source
ADD --chown=rust:rust ./ .
# build my rust code
ENV RUSTFLAGS='-L/usr/local/musl/lib -L/usr/lib/x86_64-linux-musl -L/lib/x86_64-linux-musl -C linker=musl-gcc -Clink-arg=/usr/local/musl/lib/libcrypto.a -Clink-arg=/usr/local/musl/lib/libsqlcipher.a -C link-arg=/lib/ld-musl-x86_64.so.1 -Clink-arg=/usr/lib/x86_64-linux-musl/libc.a -Ctarget-feature=-crt-static -Clink-arg=-no-pie -C target-feature=+crt-static'
ENV PKG_CONFIG_ALLOW_CROSS=1
ENV PKG_CONFIG_ALL_STATIC=true
ENV OPENSSL_STATIC=true
ENV LIBZ_SYS_STATIC=1
CMD cargo build --target x86_64-unknown-linux-musl --release --bin projectpad-cli && cp /home/rust/src/target/x86_64-unknown-linux-musl/release/projectpad-cli /host
(我的锈源在https://github.com/emmanueltouzery/projectpad2)
这完全成功并生成了二进制文件,但是它不是静态链接的:
ldd projectpad-cli
/lib/ld-musl-x86_64.so.1 => /lib64/ld-linux-x86-64.so.2 (0x00007f56d6749000)
linux-vdso.so.1 (0x00007fff301f7000)
file projectpad-cli
projectpad-cli: ELF 64-bit LSB executable,x86-64,version 1 (SYSV),dynamically linked,interpreter /lib/ld-musl-x86_64.so.1,with debug_info,not stripped
尝试从/lib/ld-musl-x86_64.so.1。中的malloc_usable_size()运行此二进制文件崩溃。
我相信是因为我的系统没有MUSL链接程序,所以它使用了glibc / gcc一个,这会引起问题。
我在想,如果我能够产生一个真正的静态二进制文件,而该二进制文件没有对链接器的引用,那么这可能会起作用。
知道我在做什么错吗?我尝试了一些builder.rs printlns,但目前还没有。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)