mirror of
https://gitlab.freedesktop.org/plymouth/plymouth.git
synced 2026-05-08 18:18:05 +02:00
read-only mirror of https://gitlab.freedesktop.org/plymouth/plymouth
The plugin two-step cannot be loaded on a system based on the musl libc library. 01:25:00.427 ply-utils.c:536:ply_open_module : Could not load module "/usr/lib/plymouth/two-step.so": Error relocating /usr/lib/plymouth/two-step.so: libintl_dgettext: symbol not found The utilities ldd and objdump reports the missing symbol: # ldd /usr/lib/plymouth/two-step.so /lib/ld-musl-aarch64.so.1 (0x7fad6c0000) libply-splash-graphics.so.5 => /usr/lib/libply-splash-graphics.so.5 (0x7fad683000) libply-splash-core.so.5 => /lib/libply-splash-core.so.5 (0x7fad654000) libply.so.5 => /lib/libply.so.5 (0x7fad629000) libc.musl-aarch64.so.1 => /lib/ld-musl-aarch64.so.1 (0x7fad6c0000) libpng16.so.16 => /usr/lib/libpng16.so.16 (0x7fad5ea000) libudev.so.1 => /lib/libudev.so.1 (0x7fad5b7000) libz.so.1 => /lib/libz.so.1 (0x7fad590000) Error relocating /usr/lib/plymouth/two-step.so: libintl_dgettext: symbol not found # objdump -T /usr/lib/plymouth/two-step.so | grep gettext 0000000000000000 D *UND* 0000000000000000 libintl_dgettext The missing symbol is archived to the library libintl.so (running plymouthd with the environment LD_PRELOAD=/usr/lib/libintl.so fixes the issue). # objdump -T /usr/lib/libintl.so | grep gettext 0000000000005aa0 g DF .text 0000000000000008 libintl_dngettext 0000000000007134 g DF .text 0000000000000004 dgettext 0000000000002300 g DF .text 0000000000000014 libintl_dcgettext 0000000000005aa8 g DF .text 0000000000000018 libintl_ngettext 0000000000007130 g DF .text 0000000000000004 gettext 0000000000007140 g DF .text 0000000000000004 dngettext 0000000000002314 g DF .text 0000000000000008 libintl_dgettext 000000000000231c g DF .text 0000000000000010 libintl_gettext 0000000000007138 g DF .text 0000000000000004 dcgettext 000000000000713c g DF .text 0000000000000004 ngettext 0000000000005a90 g DF .text 0000000000000010 libintl_dcngettext 0000000000007144 g DF .text 0000000000000004 dcngettext The story is much complicated, however, the autotools does the magic. The GNU gettext FAQ[1] says explicitly that if the program's final link command does not contain the option -lintl... > In this case it's likely a bug in the package you are building: The package's Makefiles should make sure that “-lintl” is used where needed. Autoconf sets both variables LIBINTL and LTLIBINTL with the appropriate link options if NLS is being used. These variables are left empty if the option --disable-nls is set at the configure step. LIBINTL = /usr/lib/libintl.so LTLIBINTL = -L/usr/lib -lintl This links the plugin two-step to libintl by adding the libtool variable LTLIBINTL to the list of the plugin's libraries to link with. Note: The plugin two-step loads fine on a system based on the glibc library (without this commit). The plugin uses the intermediate symbol dcgettext which is implemented by the glibc instead of the remapped symbol libintl_gettext which is implemented by gettext in libintl. On glibc: # objdump -T /usr/lib/plymouth/two-step.so | grep gettext 0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 dcgettext $ objdump -T /usr/lib/libc.so.6 | grep gettext 0000000000037ec0 w DF .text 0000000000000014 GLIBC_2.2.5 dcngettext 0000000000036630 w DF .text 0000000000000013 GLIBC_2.2.5 dcgettext 0000000000037ef0 w DF .text 000000000000001a GLIBC_2.2.5 ngettext 0000000000036660 w DF .text 0000000000000013 GLIBC_2.2.5 gettext 0000000000036630 g DF .text 0000000000000013 GLIBC_2.2.5 __dcgettext 0000000000036650 w DF .text 000000000000000e GLIBC_2.2.5 dgettext 0000000000036650 g DF .text 000000000000000e GLIBC_2.2.5 __dgettext 0000000000037ee0 w DF .text 000000000000000f GLIBC_2.2.5 dngettext On musl: # objdump -T /usr/lib/plymouth/two-step.so | grep gettext 0000000000000000 D *UND* 0000000000000000 libintl_dgettext # objdump -T /lib/libc.musl-aarch64.so.1 | grep gettext 0000000000025724 g DF .text 0000000000000010 dcgettext 0000000000027828 g DF .text 0000000000000014 ngettext 0000000000025734 g DF .text 0000000000000008 dngettext 000000000002573c g DF .text 0000000000000010 dgettext 000000000002781c g DF .text 000000000000000c gettext 0000000000025294 g DF .text 0000000000000490 dcngettext # objdump -T /usr/lib/libintl.so | grep libintl_dgettext 0000000000002314 g DF .text 0000000000000008 libintl_dgettext However, this commit changes nothing for system based on glibc as the magic of the Autoconf leaves the LIBINTL and LTLIBINTL empty even if the NLS is being used. [1]: https://www.gnu.org/software/gettext/FAQ.html#integrating_undefined Signed-off-by: Gaël PORTAY <gael.portay@collabora.com> |
||
|---|---|---|
| docs | ||
| images | ||
| po | ||
| scripts | ||
| src | ||
| systemd-units | ||
| themes | ||
| .gitignore | ||
| .gitlab-ci.yml | ||
| acinclude.m4 | ||
| AUTHORS | ||
| autogen.sh | ||
| ChangeLog | ||
| configure.ac | ||
| COPYING | ||
| INSTALL | ||
| Makefile.am | ||
| NEWS | ||
| README | ||
| TODO | ||
plymouth - graphical boot animation and logger Plymouth is an application that runs very early in the boot process (even before the root filesystem is mounted!) that provides a graphical boot animation while the boot process happens in the background. It is designed to work on systems with DRM modesetting drivers. The idea is that early on in the boot process the native mode for the computer is set, plymouth uses that mode, and that mode stays throughout the entire boot process up to and after X starts. Ideally, the goal is to get rid of all flicker during startup. For systems that don't have DRM mode settings drivers, plymouth falls back to text mode (it can also use a legacy /dev/fb interface). In either text or graphics mode, the boot messages are completely occluded. After the root file system is mounted read-write, the messages are dumped to /var/log/boot.log. Also, the user can see the messages at any time during boot up by hitting the escape key. Plymouth isn't really designed to be built from source by end users. For it to work correctly, it needs integration with the distribution. Because it starts so early, it needs to be packed into the distribution's initial ram disk, and the distribution needs to poke plymouth to tell it how boot is progressing. plymouth ships with two binaries: /sbin/plymouthd and /bin/plymouth The first one, plymouthd, does all the heavy lifting. It logs the session and shows the splash screen. The second one, /bin/plymouth, is the control interface to plymouthd. It supports things like plymouth show-splash, or plymouth ask-for-password, which trigger the associated action in plymouthd. Plymouth supports various "splash" themes which are analogous to screensavers, but happen at boot time. There are several sample themes shipped with plymouth, but most distributions that use plymouth ship something customized for their distribution. Plymouth isn't done yet. It's still under active development, but is used in several popular distros already, including Fedora, Mandriva, Ubuntu and others. See the distributions page for more information. As with other projects hosted on freedesktop.org, Plymouth follows its Code of Conduct, based on the Contributor Covenant. Please conduct yourself in a respectful and civilized manner when using the above mailing lists, bug trackers, etc: https://www.freedesktop.org/wiki/CodeOfConduct