问题标签 [musl]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1945 浏览

c++ - musl 的 GCC 包装器与 musl 的交叉编译器有何不同?

我正在尝试使用musl工具链编译各种程序,例如 MariaDB。也就是说,编译完成后,我不希望对 glibc 或 GNU 的链接器有任何依赖。

到目前为止,我一直在使用 musl 的 GCC 包装器musl-gcc来编译东西。但是,对于像 MariaDB 这样的大型程序,我很难获得所有必要的库和头文件,并且符号链接或为编译添加环境变量并没有真正的帮助

我在这个 GitHub repo 上看到提到构建一个针对 musl libc 的交叉编译器,并带有其他文档和代码。从交叉编译器的文档中:

这为您提供了一个完整的、可重定位的 musl 目标工具链,具有 C++ 支持及其自己的库路径,您可以将第三方库安装到其中。

听起来这对我有帮助,但我不确定这与 musl 的 GCC 包装器有何不同,据我所知,它只是改变了 GCC 查找库和头文件等的位置。

最终,我不确定这个交叉编译器与 GCC 包装器有多大不同,以及它是否对我有用。当我可以符号链接到现有库并使用 GCC 包装器时,为什么我需要自己的库路径来安装第三方库?交叉编译器是我应该编译的方式吗,尤其是更大的代码库?

0 投票
1 回答
332 浏览

makefile - X11 链接问题可能与 musl libc 相关

我正在运行带有 musl libc 的 Alpine Linux,试图安装-
https://github.com/patrickhaller/no-wm/
-
make install
我安装了 musl-dev 和 libx11-dev。
libx11-dev 将库放在 /usr/lib 而不是 /usr/X11/lib 中。
请参阅 - https://pkgs.alpinelinux.org/contents?branch=edge&name=libx11-dev&arch=x86&repo=main
所以我将 Makefile 行更改为 -我确认libX11.so
X11LIB = -lX11 -L/usr/lib/
位于该目录位置。

然而我的安装仍然失败,这个输出 -

我已经确认 x-alt-tab-mru.c 文件中的标头位于正确的位置,并且包含在 libx11-dev 中。

接下来我可以做些什么来解决这个问题并让它编译?我已经追了我能想到的一切。。

0 投票
2 回答
1173 浏览

c - 用 musl 编译给出:'错误重定位 - secure_getenv:找不到符号'

我正在尝试在 x86_64 Debian 上使用musl 工具链v1.2.1 编译一个简单的 C 程序。

程序secgetenv.c如下:

编译执行没有错误。但是运行ldd显示secure_getenv找不到该符号:

muslsecure_getenv在较早的补丁中添加了对的支持,我确实在以下位置看到了声明/usr/local/x86_64-linux-musl/include/stdlib.h

有相应的定义src/env/secure_getenv.c

此外,musllibc.so定义了符号:

我尝试设置LD_LIBRARY_PATH指向/usr/local/x86_64-linux-musl/lib(musl的libc所在的位置)。但这似乎没有解决任何问题。我尝试了其他一些编译器选项,但似乎没有任何解决方法。难道我做错了什么?我该如何解决这个问题?


我认为如果我添加我的编译方式可能会很有用,所以这里是详细的输出:

0 投票
0 回答
181 浏览

gettext - gettext 不会构建 libintl.so

我试图libintl.so在基于 musl 的发行版上编译,但./configure && make在包含源代码的目录中运行,我从https://savannah.gnu.org/projects/gettext/获得的源代码不会构建任何 libintl 对象。此外,libintl.h该目录中似乎也不存在。这是怎么回事?

0 投票
0 回答
69 浏览

rust - 使用 musl 库动态链接 rust 二进制文件

我有一个 rust 程序,想与 musl-libc 库链接,因为我想保持运行时内存占用小。我可以链接 musl 并轻松构建静态二进制文件。但我想用 musl 库创建一个动态链接的二进制文件。有没有办法做到这一点?

0 投票
0 回答
305 浏览

pthreads - musl中是否有任何功能,例如glibc中的“回溯”

我正在尝试将我的代码从 centos 转换为 Alpine-docker ,但是 Alpine 确实缺少一些功能,例如“backtrace”“pthread_rwlockattr_setkind_np”等。我如何在 Alpine 中使用它们或者是否有任何功能?

0 投票
1 回答
1194 浏览

rust - rust:构建一个静态链接的二进制文件,包括外部 C 库

我正在尝试使用 MUSL 静态构建我的 rust 应用程序。

我的应用程序使用 sqlcipher。这意味着静态构建的可执行文件必须包含 openssl 和 sqlcipher C 库。

我正在使用https://github.com/emk/rust-musl-builder,所以我写了一个Dockerfile以他们的 dockerfile 开头的,它已经提供了一个 MUSL 环境,包括一个静态构建的支持 musl 的 openssl。

所以“我所需要的”就是构建 sqlcipher,然后构建我的 rust 应用程序。不幸的是,这对我来说非常复杂。

这是我当前的 docker 文件:

(我的锈源在https://github.com/emmanueltouzery/projectpad2

这完全成功并生成一个二进制文件,但它不是静态链接的:

尝试在 /lib/ld-musl-x86_64.so.1 的 malloc_usable_size () 中运行此二进制文件时会崩溃。

我相信这是因为我的系统没有 MUSL 链接器,所以它使用 glibc/gcc 链接器,这会导致问题。

我在想,如果我能设法生成一个真正静态的二进制文件,它不会引用链接器,这可能会奏效。

知道我做错了什么吗?我尝试了一些builder.rs printlns,但我目前没有。

0 投票
1 回答
571 浏览

linux - 使用 musl-built tclsh8.6 执行脚本会给出“没有这样的文件或目录”

我正在尝试使用 tclsh8.6 运行一个简单的 tcl 脚本,该脚本是我使用 x86_64 Debian 上的 musl 工具链从源代码编译的。

脚本 ,hello.tcl看起来像这样:

当我尝试运行它时,出现以下错误:

必要的 tcl 库和包含文件都安装到前缀/usr/local/x86_64-linux-musl. 二进制文件也存在:

我想保持基于 musl 的东西,所以我试图避免我在其他地方找到的潜在解决方案,即重新安装 tcl 或 tcl-dev 与apt-get.

是什么导致了这个错误?非常感谢任何指导/帮助。谢谢 :)

编辑

根据一些评论的要求,这里是一些附加信息。

命令的输出file

命令的输出strace

看到这个输出后,我检查了加载器/解释器是否存在,/lib但它不存在。为了解决这个问题,我跑了:

当我运行时,这给了我一个不同的错误tclsh8.6

运行它sudo会给出同样的结果:

解释器和脚本的权限如下:

希望这些新信息能提供更多帮助。

编辑 2

更多权限信息:)

这是以下内容/lib/libc.so

它是一个链接器脚本,如果你使可执行文件失败并说库已损坏。

0 投票
1 回答
249 浏览

linux - 使用 Qemu 用户模式运行 ARM64 二进制文件的问题

我正在尝试使用 Qemu 用户模式在我的 Kali Linux 机器上运行 ARM64 二进制文件。这是二进制

我可以看到它是一个 Go 程序并且是使用编译的,musl所以我安装了musl-cross-makemusl:arm64,libc6-dev-arm64-crossgcc-aarch64-linux-gnu from apt

但是,每次我尝试运行它时,都会收到所有这些Error relocating: symbol not found错误。

还有更多错误,但我省略了它们。我有libgps.so和所有其他二进制文件可能无法重新定位的文件。有谁知道问题可能是什么?

0 投票
1 回答
201 浏览

linux - 如何加载没有版本信息的 DSO?

如何让动态加载器为需要版本信息的库/可执行文件加载没有版本信息的库?

例如,假设我正在尝试运行/bin/bash它需要符号 S 和版本 XYZ 并libtinfo.so.6提供符号 S,但由于是使用 musl 工具链构建的,因此没有版本信息。目前,这给了我以下错误:

我试图避免这里描述的过程,在该过程中我制作了一个自定义 DSO,它基本上将所有符号(即我必须写出每个符号)映射到 musl 库中的适当符号。我已经看到很多关于在 DSO 中加载旧版本符号的讨论,但没有关于没有符号版本的讨论。

这是否需要我重新编译所有带有版本符号的二进制文件,以便它们不包含版本信息?

谢谢你的帮助!

更新

经过一番调查,我发现它/bin/bash有一些符号,libtinfo.so.6例如tgoto, tgetstr, tputs, tgetent, tgetflag, tgetnum, UP,BC,PC. tputs@NCURSES6_TINFO_5.0.19991023当动态加载器试图在 musl-built中找到这些符号的正确版本(例如, )时,libtinfo.so.6它会失败,因为该文件中没有版本信息。

我认为我已经开始使用 hack-y 解决方案(希望有更好的解决方案)。本质上,我制作了一个 DSO,我使用 GNU 工具链编译并加载LD_PRELOAD. 在这个 DSO 中,我打开了 musl-built libtinfo.so.6.1withdlopen并使用dlsym来获取所需的符号。然后,这些符号将在全球范围内可用。虽然没有版本信息libtinfo.so.6,但有版本部分(.gnu.version.gnu.version_r),我能够执行 bash 而不会出现任何错误/警告。DSO 来源如下:

然而,这个解决方案似乎并不总是有效,在测试 musl 构建的二进制文件时,我仍然看到与上面相同的警告,但这一次,它们不会使测试崩溃,只是打印一个警告。


还应该注意的是,libreadline.solibtinfo.so. 这似乎源于我的 musl-builtlibreadline.so版本错误(8 而不是 7),因此我的配置脚本转到了版本 7 的 GNU ,这试图引入引发错误libreadline.so的 musl 。libtinfo.so使用 musl 工具链构建libreadline.so.7完美地解决了这个错误。