Find a file
Gaël PORTAY bd273d2703 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>
2021-03-23 10:51:31 +01:00
docs docs: fix man page cross-reference 2020-05-30 13:51:47 +02:00
images ship bizcom unconditionally 2008-06-22 00:49:24 -04:00
po Added translation using Weblate (Sinhala) 2021-03-23 10:41:42 +01:00
scripts scripts: Remove new-object.sh 2021-03-06 10:40:36 +01:00
src two-step: Links against libintl.so if LNS 2021-03-23 10:51:31 +01:00
systemd-units systemd: switch to KillMode=mixed 2021-02-22 12:45:11 +00:00
themes autogoo: use /proc/self/fd/0 instead of /dev/stdin 2020-07-09 09:34:36 -04:00
.gitignore gitignore: Add translation related generated files to .gitignore 2019-10-15 11:33:55 +02:00
.gitlab-ci.yml Apply suggestion to .gitlab-ci.yml 2020-07-08 19:20:46 +00:00
acinclude.m4 [configure] Add AS_AC_EXPAND for configured dirs 2009-08-07 16:32:32 -04:00
AUTHORS Add Peter to AUTHORS 2008-06-10 21:59:10 -04:00
autogen.sh build-goo: get rid of warnings related to non-GNU systems 2013-12-11 13:32:54 -05:00
ChangeLog Put in ChangeLog request to not use ChangeLog 2008-05-20 15:15:03 -04:00
configure.ac The use of AM_GNU_GETTEXT_VERSION in configure.ac instructs autopoint to 2021-03-09 12:12:23 +00:00
COPYING initial import 2007-05-08 17:48:00 -04:00
INSTALL build-goo: Remove vestigial remnants of old GDM integration code. 2020-03-07 00:36:54 +08:00
Makefile.am po: drop intltool usage 2020-07-08 15:12:54 -04:00
NEWS initial import 2007-05-08 17:48:00 -04:00
README README: add link to Code of Conduct 2018-08-06 14:58:18 -04:00
TODO Add hack to make maintenance mode probably work when 2008-06-30 17:55:15 -04:00

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