我想在带有 M1 芯片的 macOS Monterey 12.3.1 中使用 musl 构建 rust 1.59 项目,然后运行以下命令:
rustup target add x86_64-unknown-linux-musl
cargo build --release --target=x86_64-unknown-linux-musl
Run Code Online (Sandbox Code Playgroud)
但项目构建输出如下:
error: failed to run custom build command for `ring v0.16.20`
Caused by:
process didn't exit successfully: `/Users/foo/source/reddwarf/backend/fortune/target/release/build/ring-98ce1debbcda4321/build-script-build` (exit status: 101)
--- stdout
OPT_LEVEL = Some("3")
TARGET = Some("x86_64-unknown-linux-musl")
HOST = Some("aarch64-apple-darwin")
CC_x86_64-unknown-linux-musl = None
CC_x86_64_unknown_linux_musl = None
TARGET_CC = None
CC = None
CROSS_COMPILE = None
CFLAGS_x86_64-unknown-linux-musl = None
CFLAGS_x86_64_unknown_linux_musl = None
TARGET_CFLAGS = None
CFLAGS = None
CRATE_CC_NO_DEFAULTS …
Run Code Online (Sandbox Code Playgroud) 我正在musl-libc
为aarch64
(ARM 64位)平台上的项目静态构建.我想避免使用任何软浮点库,例如GCC的软浮点库例程.但是,即使我使用它们,它们仍然出现在库档案中-mfloat-abi=hard
.我可以说,这是因为ARM 64位平台将a定义long double
为128位.
有没有办法改变这种行为?例如,我可以强制long double
定义为与double
?相同的大小吗?我知道这是C标准所允许的,但我不确定是否有任何方法可以强制Clang(我特意使用Clang)来编译这样的定义.
我正在尝试在运行OS X 10.11.5的机器上构建musl-libc.不幸的是,我在运行时遇到以下错误make
:
clang: warning: optimization flag '-fexcess-precision=standard' is not supported
clang: warning: optimization flag '-frounding-math' is not supported
<inline asm>:6:1: error: unknown directive
.weak _DYNAMIC
^
<inline asm>:7:1: error: unknown directive
.hidden _DYNAMIC
^
2 errors generated.
make: *** [obj/crt/Scrt1.o] Error 1
Run Code Online (Sandbox Code Playgroud)
我正在使用Clang 7.3.0(703-0-31),而我正在使用来自musl repo的源码git://git.musl-libc.org/musl
.
有没有人在尝试执行命令时遇到此错误docker-compose up
。
我试图通过查看其他涉及类似内容的文章来解决这个问题,但没有成功。
我正在尝试使用 docker-compose 文件运行我的 spring boot 应用程序,但不断收到此错误:
qemu-x86_64: Could not open '/lib/ld-musl-x86_64.so.1': No such file or directory
Run Code Online (Sandbox Code Playgroud)
我试图按照我在网上阅读的建议来修复它,但没有任何效果。
我努力了:
阅读这篇文章后: https: //github.com/nodejs/help/issues/3239 添加以下内容
platform: linux/amd64
Run Code Online (Sandbox Code Playgroud)
到我的 docker-compose 文件,但没有什么区别
并FROM --platform=linux/amd64
在我的 Dockerfile 前面尝试过
当我读到这篇文章时,我也尝试安装musl
但无法执行make
命令
curl https://musl.libc.org/releases/musl-1.2.2.tar.gz -o musl-1.2.2.tar.gz
tar -xvf musl-1.2.2.tar.gz
cd musl-1.2.2
./configure
make
make install
Run Code Online (Sandbox Code Playgroud)
我的 Docker 文件如下所示
FROM azul/zulu-openjdk-alpine:11 as packager
RUN { \
java --version ; \
echo "jlink version:" && \
jlink --version ; \
} …
Run Code Online (Sandbox Code Playgroud) 我正在尝试交叉编译一个 Rust 项目,arm-linux-musleabihf
并且在使用musl-cross-make
. rust 项目依赖于libgit2
,这似乎是导致问题的依赖。
使用:
rustup
)arm-unknown-linux-musleabihf
目标musl-cross-make
的TARGET=arm-linux-musleabihf
TARGET_CC_linux_arm-unknown-linux-musleabihf
和CARGO_TARGET_ARM_UNKNOWN_LINUX_MUSLEABIHF_LINKER
在/opt/musl-cross-make/output/bin/arm-linux-musleabihf-gcc
构建时出现错误:
error: linking with `/opt/musl-cross-make/output/bin/arm-linux-musleabihf-gcc` failed: exit code: 1
...
= note: /opt/musl-cross-make/output/bin/../lib/gcc/arm-linux-musleabihf/9.2.0/../../../../arm-linux-musleabihf/bin/ld: /tmp/rustcvSvGAJ/liblibgit2_sys-e56c2f9bd024a0a9.rlib(odb.o): in function `git_odb__add_default_backends':
odb.c:(.text.git_odb__add_default_backends+0x24): undefined reference to `__stat_time64'
/opt/musl-cross-make/output/bin/../lib/gcc/arm-linux-musleabihf/9.2.0/../../../../arm-linux-musleabihf/bin/ld: /tmp/rustcvSvGAJ/liblibgit2_sys-e56c2f9bd024a0a9.rlib(config.o): in function `git_config_add_file_ondisk':
config.c:(.text.git_config_add_file_ondisk+0x34): undefined reference to `__stat_time64'
/opt/musl-cross-make/output/bin/../lib/gcc/arm-linux-musleabihf/9.2.0/../../../../arm-linux-musleabihf/bin/ld: /tmp/rustcvSvGAJ/liblibgit2_sys-e56c2f9bd024a0a9.rlib(config_file.o): in function `config_file_read':
config_file.c:(.text.config_file_read+0x48): undefined reference to `__stat_time64'
...etc...
Run Code Online (Sandbox Code Playgroud)
看起来链接器在解析特定于 musl 的time64
符号时遇到了困难,目前尚不清楚原因。
这在以下情况下工作正常:
x86_64-linux-musl …
我正在尝试使用 x11 编译程序并使用 musl 作为 c 库。我的系统上仍然有 glibc。Musl 位于/usr/local/musl/include
The glib headers are still in/usr/include
当我与
musl-gcc test.c
Run Code Online (Sandbox Code Playgroud)
我明白了fatal error: X11/Xlib.h: no such file or directory
如果我尝试
musl-gcc test.c -I/usr/include
Run Code Online (Sandbox Code Playgroud)
它包含 glib 标头而不是 musl 标头,并引发一堆错误。
如果我尝试
musl-gcc test.c -I/usr/local/musl/include -I/usr/include
Run Code Online (Sandbox Code Playgroud)
它仍然包含 /usr/include 中 glib 的标头
如何使 musl-gcc 使用 musl 标头,但仍包含 /usr/include 中的其他文件?
我正在尝试将 Rust 服务器从 Heroku 移动到 Google Cloud 或 AWS。尽管我喜欢git push
使用指定的 buildpack进行构建和部署到 Heroku的简单性,但该服务对我来说并不划算。
我将 Google Cloud Run 和 AWS Elastic Beanstalk 确定为潜在的替代方案。
首先,我需要使用静态二进制文件构建一个 docker 镜像。
因此,我添加了这个 Dockerfile:
FROM rust AS build
WORKDIR /usr/src
RUN rustup target add x86_64-unknown-linux-musl
RUN apt-get update && apt-get upgrade -y && apt-get install -y build-essential git clang llvm-dev libclang-dev libssl-dev pkg-config libpq-dev musl-tools brotli
RUN USER=root cargo new loxe-api
WORKDIR /usr/src/loxe-api
COPY Cargo.toml Cargo.lock ./
COPY data ./data
COPY migrations ./migrations
ENV RUSTFLAGS="-C target-feature=+crt-static" …
Run Code Online (Sandbox Code Playgroud) musl C 库只有符号版本控制的近似实现。这可能导致具有不同符号版本的符号绑定在一起,这在完整实现中不会发生。因此,希望使用 musl 构建的项目最好完全避免符号版本控制。(不支持符号版本控制本身对于工具链来说不一定是一个糟糕的选择;这完全取决于目标受众。)
但是,Alpine Linux 工具链编译 binutils 时具有完整的符号版本支持:GAS 支持该.symver
指令,链接编辑器处理版本脚本并分配符号版本(就像在 GNU/Linux 上一样)。一个简单的编译器/汇编器或链接检查显示符号版本的支持。因此,Alpine Linux 在发行版中包含的一些共享对象实际上使用了符号版本控制,尽管 musl 动态加载器会忽略这些数据。(数据只会使二进制文件膨胀。)
在某些情况下,软件无法运行(在构建正常之后),因为它以 musl 动态链接器不支持的方式使用兼容性符号(没有默认版本的符号)。这是一个不起作用的小例子:
cat > symver.c <<EOF
void
compat_function (void)
{
}
__asm__ (".symver compat_function,compat_function@SYMVER");
void
call_compat_function (void)
{
return compat_function ();
}
EOF
echo "SYMVER { };" > symver.map
cat > main.c <<EOF
extern void call_compat_function (void);
int
main (void)
{
call_compat_function ();
}
EOF
gcc -fpic -shared -o symver.so -Wl,--version-script=symver.map symver.c
gcc -Wl,--rpath=. -o main …
Run Code Online (Sandbox Code Playgroud) 我正在使用跨Musl编译器(相同版本)构建本机musl编译器(GCC 8.3.0),但出现此错误:
In file included from /usr/local/x86_64-cros-linux-musl/include/pthread.h:30,
from /usr/local/x86_64-cros-linux-musl/lib/gcc/x86_64-cros-linux-musl/8.3.0/include/c++/x86_64-cros-linux-musl/bits/gthr-default.h:35,
from /usr/local/x86_64-cros-linux-musl/lib/gcc/x86_64-cros-linux-musl/8.3.0/include/c++/x86_64-cros-linux-musl/bits/gthr.h:148,
from /usr/local/x86_64-cros-linux-musl/lib/gcc/x86_64-cros-linux-musl/8.3.0/include/c++/ext/atomicity.h:35,
from /usr/local/x86_64-cros-linux-musl/lib/gcc/x86_64-cros-linux-musl/8.3.0/include/c++/bits/basic_string.h:39,
from /usr/local/x86_64-cros-linux-musl/lib/gcc/x86_64-cros-linux-musl/8.3.0/include/c++/string:52,
from ../../gcc-8.3.0/gcc/brig/brigfrontend/brig-to-generic.h:25,
from ../../gcc-8.3.0/gcc/brig/brig-lang.c:46:
/usr/local/x86_64-cros-linux-musl/include/sched.h:76:7: error: attempt to use poisoned "calloc"
void *calloc(size_t, size_t);
^
/usr/local/x86_64-cros-linux-musl/include/sched.h:116:36: error: attempt to use poisoned "calloc"
#define CPU_ALLOC(n) ((cpu_set_t *)calloc(1,CPU_ALLOC_SIZE(n)))
^
Run Code Online (Sandbox Code Playgroud)
关于如何规避这一点的任何想法?
细节:
目标/主机三重: x86_64-linux-musl
音乐版本: 1.1.21
我在这里应用了musl补丁:http ://port70.net/~nsz/musl/gcc-8.2.0/
我已经在源目录中运行了此命令:
sed -e '/m64=/s/lib64/lib/' -i gcc/config/i386/t-linux64
Run Code Online (Sandbox Code Playgroud) musl ×10
c ×3
rust ×3
alpine-linux ×2
clang ×2
arm ×1
arm64 ×1
binutils ×1
building ×1
docker ×1
dockerfile ×1
gcc ×1
include-path ×1
java ×1
lld ×1
llvm ×1
macos ×1
rust-cargo ×1
toolchain ×1