Alpine Linux编译Rocket.rs 0.5-rc2时链接器找不到crti.o
解决Rocket v0.5-rc2在Alpine Linux编译时crti.o缺失问题
问题描述
升级应用至Rocket v0.5-rc2后,在Alpine Linux环境编译时出现链接器错误,提示无法找到crti.o文件,相关配置及报错信息如下:
原Dockerfile
ARG BINARY_NAME=rocketdieselstack FROM rust:alpine3.16 as builder RUN rustup update nightly && rustup default nightly #install dev packages RUN apk add pcc-libs-dev #get the sources ADD --chown=rust:rust . ./ #build container RUN cargo build --release #remove sources RUN rm src/*.rs FROM alpine:latest #environment setup ARG APP=/usr/src/app EXPOSE 8000 ENV TZ=Etc/UTC \ APP_USER=appuser RUN addgroup -S $APP_USER \ && adduser -S -g $APP_USER $APP_USER RUN apk update \ && apk add --no-cache ca-certificates tzdata bash\ && rm -rf /var/cache/apk/* #add group and create directory RUN mkdir -p ${APP} COPY --from=builder /home/rust/src/target/x86_64-unknown-linux-musl/release/${BINARY_NAME} ${APP}/${BINARY_NAME} RUN chown -R $APP_USER:$APP_USER ${APP} USER ${APP_USER} WORKDIR ${APP} CMD ["./rocketdieselstack"]
编译报错
#14 ERROR: executor failed running [/bin/sh -c cargo build --release]: exit code: 101 ------ > [builder 5/6] RUN cargo build --release: #14 185.1 error: linking with `cc` failed: exit status: 1 #14 185.1 | #14 185.1 = note: "cc" "-Wl,--version-script=/tmp/rustcyfX4Hz/list" "-m64" "/tmp/rustcyfX4Hz/symbols.o" "/target/release/deps/time_macros-36b840665dbccb38.time_macros.6a053ec9-cgu.0.rcgu.o" ...(省略冗余链接参数) #14 185.1 = note: /usr/lib/gcc/x86_64-alpine-linux-musl/11.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find crti.o: No such file or directory #14 185.1 collect2: error: ld returned 1 exit status #14 185.1 #14 185.1 #14 185.1 Compiling parking_lot v0.12.1 #14 185.2 error: could not compile `time-macros` due to previous error #14 185.2 warning: build failed, waiting for other jobs to finish... ------
原因分析
crti.o是musl C标准库的初始化目标文件,属于编译基础依赖组件。原Dockerfile仅安装了pcc-libs-dev(PCC编译器的库文件),但Rust工具链依赖GCC/musl工具链,缺少对应的musl-dev和gcc包导致链接器找不到该文件。
解决方案
修改builder阶段的依赖安装命令,替换为Alpine下适配Rust的标准编译依赖包:
修改后的Dockerfile(builder阶段关键部分)
ARG BINARY_NAME=rocketdieselstack FROM rust:alpine3.16 as builder RUN rustup update nightly && rustup default nightly # 替换为gcc和musl-dev,提供完整的编译工具链 RUN apk add gcc musl-dev #get the sources ADD --chown=rust:rust . ./ #build container RUN cargo build --release # 后续阶段保持不变...
说明
gcc提供Rust链接时所需的GCC工具链支持musl-dev包含musl C标准库的头文件和初始化目标文件(如crti.o),满足静态链接需求- 移除
pcc-libs-dev,它与Rust默认使用的GCC工具链不兼容
内容的提问来源于stack exchange,提问作者crlsktr
相关产品推荐
相关产品推荐

