]> git.ipfire.org Git - thirdparty/plymouth.git/commit
two-step: Links against libintl.so if LNS
authorGaël PORTAY <gael.portay@collabora.com>
Fri, 18 Dec 2020 17:12:54 +0000 (12:12 -0500)
committerHans de Goede <hdegoede@redhat.com>
Tue, 23 Mar 2021 09:51:31 +0000 (10:51 +0100)
commitbd273d2703dc8b862269ee700a83571730c25d3d
treeba46f9570663634ace1926fa53595630d254f425
parenta2dcb19d8d431dc7b5b1f7e52f238a41d1ecdeff
two-step: Links against libintl.so if LNS

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>
src/plugins/splash/two-step/Makefile.am