2

我正在使用 AlpineLinux(安装在我的计算机上,而不是安装在 docker 中),并且我正在尝试使用依赖于 glibc 的共享库。

由于 Glibc 没有集成到这个发行版中,我看到gcompat开发了一个替代方案 ,以提供与为 Glibc 构建的程序的兼容性。

我要使用的库是 IDS Imaging 的驱动程序(用于他们的相机)。动态加载.sowith CDLL(从 python 脚本)时,它会失败。

失败后,我跑去ldd libueye_api.so检查是否找到了所有依赖项,我得到了:

/lib/ld-musl-x86_64.so.1 (0x7fb685c50000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x7fb684d93000)
    librt.so.1 => /lib/ld-musl-x86_64.so.1 (0x7fb685c50000)
    libdl.so.2 => /lib/ld-musl-x86_64.so.1 (0x7fb685c50000)
    libpthread.so.0 => /lib/ld-musl-x86_64.so.1 (0x7fb685c50000)
    libgomp.so.1 => /usr/lib/libgomp.so.1 (0x7fb684d51000)
    libm.so.6 => /lib/ld-musl-x86_64.so.1 (0x7fb685c50000)
    libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x7fb684d38000)
    libc.so.6 => /lib/ld-musl-x86_64.so.1 (0x7fb685c50000)
    ld-linux-x86-64.so.2 => /lib/ld-linux-x86-64.so.2 (0x7fb684d32000)
Error relocating libueye_api.so: __pthread_register_cancel: symbol not found
Error relocating libueye_api.so: __pthread_unregister_cancel: symbol not found

在此日志中,我看到 musl 和 gcompat 已成功找到__pthread_register_cancel__pthread_unregister_cancel但未找到...

有人有解决这个问题的想法吗?

4

1 回答 1

2

AlpineLinux 使用 MUSL 而不是 GLIBC。MUSL 更轻,不会拖累遗产。当应用程序依赖于遗留时,这是一个问题,比如当他们想要使用 pthread 时。

AlpineLinux 有一个 wiki,描述了运行需要 GLIBC 的应用程序的 4 种替代方案。

https://wiki.alpinelinux.org/wiki/Running_glibc_programs

一种选择是使用来自社区贡献的 gcompat 包。APK 包、描述和其他详细信息在 pkgs 页面上

https://pkgs.alpinelinux.org/packages?name=gcompat&branch=edge&repo=community&arch=x86_64

在 APKBUILD 文件中,它显示了源代码的来源,并且兼容库中的 pthread 没有 __pthread_register_cancel。在您的堆栈跟踪中,我没有看到对 /lib/libgcompat.so.0 的任何引用,因此可能仍需要通过运行 ldconfig 找到该库,但我认为 gcompat 不包含所有 pthread 方法。它只是不在代码中

https://git.adelielinux.org/adelie/gcompat/-/blob/current/libgcompat/pthread.c

我隐约记得我曾经在 AlpineLinux 中安装过 GLIBC 包,但这可能只是我疯狂的梦想之一,我在存储库中找不到这样的包

我找到的是 Sasha Gerrand 的 APK 和 Docker 映像,他为 AlpineLinux 创建了完整的 GLIBC 2.34 库。如果您安装 APK 包或使用 Docker 映像,您应该在 AlpineLinux 上运行完整的 glibc。

https://github.com/sgerrand/alpine-pkg-glibc

就我个人而言,我会尽量避免运行依赖库的应用程序,但我知道有时切换到更灵活的东西并不是一个选择。

于 2021-12-16T12:08:17.953 回答