diff mbox series

[v2] ldconfig-native: Add usrmerge support

Message ID 20231206074307.21110-1-johannes.pointner@br-automation.com
State New
Headers show
Series [v2] ldconfig-native: Add usrmerge support | expand

Commit Message

Johannes Pointner Dec. 6, 2023, 7:40 a.m. UTC
From: Johannes Pointner <johannes.pointner@br-automation.com>

If DISTRO_FEATURE usrmerge is enabled, SLIBDIR is just a symlink to LIBDIR.
ldconfig-native uses hardcoded paths for SLIBDIR and LIBDIR that are fine for
the not usrmerge case. But if usrmerge is enabled ldconfig-native generates a
ld.so.cache, which is done in rootfs.py, that looks like this:
236 libs found in cache `/etc/ld.so.cache'
       libzstd.so.1 (libc6) => /lib/libzstd.so.1
       libz.so.1 (libc6) => /lib/libz.so.1
       libxtables.so.12 (libc6) => /lib/libxtables.so.12
       libxslt.so.1 (libc6) => /lib/libxslt.so.1
       libxml2.so.2 (libc6) => /lib/libxml2.so.2

This breaks for example the Qt QLibraryInfo paths if Qt is configured
'relocatable' and leads to the issue that the QtWebEngine can find the
QtWebEngineProcess, Qt WebEngine resources,...

Therefore don't let ldconfig-native parse SLIBDIR if it is a symlink.

Signed-off-by: Johannes Pointner <johannes.pointner@br-automation.com>
---
v2: fixed sendemail.from and enhanced explanation

 .../ldconfig-add-usrmerge-support.patch       | 37 +++++++++++++++++++
 .../glibc/ldconfig-native_2.12.1.bb           |  1 +
 2 files changed, 38 insertions(+)
 create mode 100644 meta/recipes-core/glibc/ldconfig-native-2.12.1/ldconfig-add-usrmerge-support.patch

Comments

Ross Burton Dec. 13, 2023, 11:01 a.m. UTC | #1
On 6 Dec 2023, at 07:40, Johannes Pointner via lists.openembedded.org <johannes.pointner=br-automation.com@lists.openembedded.org> wrote:
> 
> From: Johannes Pointner <johannes.pointner@br-automation.com>
> 
> If DISTRO_FEATURE usrmerge is enabled, SLIBDIR is just a symlink to LIBDIR.
> ldconfig-native uses hardcoded paths for SLIBDIR and LIBDIR that are fine for
> the not usrmerge case. But if usrmerge is enabled ldconfig-native generates a
> ld.so.cache, which is done in rootfs.py, that looks like this:
> 236 libs found in cache `/etc/ld.so.cache'
>       libzstd.so.1 (libc6) => /lib/libzstd.so.1
>       libz.so.1 (libc6) => /lib/libz.so.1
>       libxtables.so.12 (libc6) => /lib/libxtables.so.12
>       libxslt.so.1 (libc6) => /lib/libxslt.so.1
>       libxml2.so.2 (libc6) => /lib/libxml2.so.2
> 
> This breaks for example the Qt QLibraryInfo paths if Qt is configured
> 'relocatable' and leads to the issue that the QtWebEngine can find the
> QtWebEngineProcess, Qt WebEngine resources,...
> 
> Therefore don't let ldconfig-native parse SLIBDIR if it is a symlink.

This still doesn’t explain *why* ldconfig is broken, why the workaround is a yocto-specific fix in ldconfig and not a general fix that other distros have, and why this isn’t a problem with Qt.

Ross
Johannes Pointner Dec. 15, 2023, 12:36 p.m. UTC | #2
On Wed, Dec 13, 2023 at 12:01 PM Ross Burton <ross.burton@arm.com> wrote:
>
> On 6 Dec 2023, at 07:40, Johannes Pointner via lists.openembedded.org <johannes.pointner=br-automation.com@lists.openembedded.org> wrote:
> >
> > From: Johannes Pointner <johannes.pointner@br-automation.com>
> >
> > If DISTRO_FEATURE usrmerge is enabled, SLIBDIR is just a symlink to LIBDIR.
> > ldconfig-native uses hardcoded paths for SLIBDIR and LIBDIR that are fine for
> > the not usrmerge case. But if usrmerge is enabled ldconfig-native generates a
> > ld.so.cache, which is done in rootfs.py, that looks like this:
> > 236 libs found in cache `/etc/ld.so.cache'
> >       libzstd.so.1 (libc6) => /lib/libzstd.so.1
> >       libz.so.1 (libc6) => /lib/libz.so.1
> >       libxtables.so.12 (libc6) => /lib/libxtables.so.12
> >       libxslt.so.1 (libc6) => /lib/libxslt.so.1
> >       libxml2.so.2 (libc6) => /lib/libxml2.so.2
> >
> > This breaks for example the Qt QLibraryInfo paths if Qt is configured
> > 'relocatable' and leads to the issue that the QtWebEngine can find the
> > QtWebEngineProcess, Qt WebEngine resources,...
> >
> > Therefore don't let ldconfig-native parse SLIBDIR if it is a symlink.
>
> This still doesn’t explain *why* ldconfig is broken, why the workaround is a yocto-specific fix in ldconfig and not a general fix that other distros have, and why this isn’t a problem with Qt.
As I wrote above ldconfig-native is broken for the usrmerge case
because it uses hardcoded paths which are correct for the "not
usrmerge case" but not for the "usrmerge case".
Other distros as also the yocto ldconfig for the target system is
configured at build time with the correct paths and works fine.
This is an issue for Qt because it tries to determine the library
locations using dladdr and this leads to incorrect paths that in my
case broke QtWebEngine.
>
> Ross
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#192282): https://lists.openembedded.org/g/openembedded-core/message/192282
> Mute This Topic: https://lists.openembedded.org/mt/103009101/3617353
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [h4nn35.work@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
Khem Raj Dec. 15, 2023, 5:25 p.m. UTC | #3
On Fri, Dec 15, 2023 at 4:37 AM Johannes Pointner <h4nn35.work@gmail.com> wrote:
>
> On Wed, Dec 13, 2023 at 12:01 PM Ross Burton <ross.burton@arm.com> wrote:
> >
> > On 6 Dec 2023, at 07:40, Johannes Pointner via lists.openembedded.org <johannes.pointner=br-automation.com@lists.openembedded.org> wrote:
> > >
> > > From: Johannes Pointner <johannes.pointner@br-automation.com>
> > >
> > > If DISTRO_FEATURE usrmerge is enabled, SLIBDIR is just a symlink to LIBDIR.
> > > ldconfig-native uses hardcoded paths for SLIBDIR and LIBDIR that are fine for
> > > the not usrmerge case. But if usrmerge is enabled ldconfig-native generates a
> > > ld.so.cache, which is done in rootfs.py, that looks like this:
> > > 236 libs found in cache `/etc/ld.so.cache'
> > >       libzstd.so.1 (libc6) => /lib/libzstd.so.1
> > >       libz.so.1 (libc6) => /lib/libz.so.1
> > >       libxtables.so.12 (libc6) => /lib/libxtables.so.12
> > >       libxslt.so.1 (libc6) => /lib/libxslt.so.1
> > >       libxml2.so.2 (libc6) => /lib/libxml2.so.2
> > >
> > > This breaks for example the Qt QLibraryInfo paths if Qt is configured
> > > 'relocatable' and leads to the issue that the QtWebEngine can find the
> > > QtWebEngineProcess, Qt WebEngine resources,...
> > >
> > > Therefore don't let ldconfig-native parse SLIBDIR if it is a symlink.
> >
> > This still doesn’t explain *why* ldconfig is broken, why the workaround is a yocto-specific fix in ldconfig and not a general fix that other distros have, and why this isn’t a problem with Qt.
> As I wrote above ldconfig-native is broken for the usrmerge case
> because it uses hardcoded paths which are correct for the "not
> usrmerge case" but not for the "usrmerge case".
> Other distros as also the yocto ldconfig for the target system is
> configured at build time with the correct paths and works fine.
> This is an issue for Qt because it tries to determine the library
> locations using dladdr and this leads to incorrect paths that in my
> case broke QtWebEngine.

This is good explanation in general. It would be good to explain a bit
on how QT uses the native version of QT to manipulate paths
for QTWebengine.

> >
> > Ross
> >
> >
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#192429): https://lists.openembedded.org/g/openembedded-core/message/192429
> Mute This Topic: https://lists.openembedded.org/mt/103009101/1997914
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [raj.khem@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
diff mbox series

Patch

diff --git a/meta/recipes-core/glibc/ldconfig-native-2.12.1/ldconfig-add-usrmerge-support.patch b/meta/recipes-core/glibc/ldconfig-native-2.12.1/ldconfig-add-usrmerge-support.patch
new file mode 100644
index 0000000000..3041d433fd
--- /dev/null
+++ b/meta/recipes-core/glibc/ldconfig-native-2.12.1/ldconfig-add-usrmerge-support.patch
@@ -0,0 +1,37 @@ 
+From 6e543f39f6bec6eb2e02eea02029c7f4ec533b66 Mon Sep 17 00:00:00 2001
+From: Johannes Pointner <johannes.pointner@br-automation.com>
+Date: Fri, 1 Dec 2023 11:02:39 +0100
+Subject: [PATCH] ldconfig: add usrmerge support
+
+Check whether SLIBDIR is a symlink, which is the case if usrmerge
+is enabled, and if so, ignore it.
+
+Upstream-Status: Inappropriate [embedded specific]
+
+Signed-off-by: Johannes Pointner <johannes.pointner@br-automation.com>
+---
+ ldconfig.c | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+diff --git a/ldconfig.c b/ldconfig.c
+index e826410..72ac67b 100644
+--- a/ldconfig.c
++++ b/ldconfig.c
+@@ -1371,10 +1371,16 @@ main (int argc, char **argv)
+ 
+   if (!opt_only_cline)
+     {
++      struct stat buf;
++      int ret;
+       parse_conf (config_file, true);
+ 
+       /* Always add the standard search paths.  */
+-      add_system_dir (SLIBDIR);
++      /* Check whether SLIBDIR is a symlink, which is the case if usrmerge
++       is enabled, and if so, ignore it. */
++      ret = lstat(SLIBDIR ,&buf);
++      if(ret == -1 || !S_ISLNK(buf.st_mode))
++        add_system_dir (SLIBDIR);
+       if (strcmp (SLIBDIR, LIBDIR))
+ 	add_system_dir (LIBDIR);
+       add_system_dir (SLIBDIR32);
diff --git a/meta/recipes-core/glibc/ldconfig-native_2.12.1.bb b/meta/recipes-core/glibc/ldconfig-native_2.12.1.bb
index 4db67c3ad4..85fc87257d 100644
--- a/meta/recipes-core/glibc/ldconfig-native_2.12.1.bb
+++ b/meta/recipes-core/glibc/ldconfig-native_2.12.1.bb
@@ -16,6 +16,7 @@  SRC_URI = "file://ldconfig-native-2.12.1.tar.bz2 \
            file://add-64-bit-flag-for-ELF64-entries.patch \
            file://no-aux-cache.patch \
            file://add-riscv-support.patch \
+           file://ldconfig-add-usrmerge-support.patch \
 "