Use shared library that uses glibc on AlpineLinux

8.7k views Asked by At

I'm working on an AlpineLinux (installed on my computer, not into a docker) and I'm trying to use a shared library which depends on glibc.

As Glibc isn't integrated into this distribution, I saw that an alternative, gcompat, was developed to provide a compatiblity with programs that were built for Glibc.

The library I want to use is the IDS Imaging's driver (for their camera). When loading dynamically the .so with CDLL (from a python script), it fails.

After this fail, I ran ldd libueye_api.so to check if all dependencies were found and I got :

/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

In this log I see that musl and gcompat were successfully found but __pthread_register_cancel and __pthread_unregister_cancel were not found...

Someone has an idea to solve this issue ?

2

There are 2 answers

0
sleepyhead On

AlpineLinux uses MUSL instead of GLIBC. MUSL is lighter and doesn't drag a legacy with it. This is a problem when applications depend on the legacy, like when they want to use pthread.

AlpineLinux has a wiki that describes 4 alternatives for running applications that require GLIBC.

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

One of the options is to use the gcompat package from a community contribution. The APK package, description and other details are on the pkgs pages

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

In the APKBUILD file it shows where the source code come from and the pthread in the compat lib does not have __pthread_register_cancel. In your stacktrace I don't see any reference to /lib/libgcompat.so.0, so maybe the library still needs to be found, by running ldconfig, but I think gcompat does not contain all pthread methods. It just isn't in the code

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

I vaguely remember that I once installed GLIBC packages in AlpineLinux, but that may just have been one of my crazy dreams, I can't find such package in the repositories

What I do find is an APK and Docker image by Sasha Gerrand, who created a full GLIBC 2.34 library for AlpineLinux. If you install the APK package or use the Docker image, you should have a full glibc running on AlpineLinux.

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

Personally I would try to avoid running applications that are so library dependent, but I understand it sometimes isn't a choice to switch to something more flexible.

0
Catherine On

You can try out Alpaquita Linux: https://hub.docker.com/r/bellsoft/alpaquita-linux-base it is based on Alpine and includes the same features, but it has an additional version based on glibc. It is only a few megabytes heavier than the musl-based version (3Mb vs 10Mb), but It will solve your problem with dynamic linking.