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>
2 jobs for two-step-link-libintl-if-nls in 3 minutes and 57 seconds (queued for 1 second)
latest