]> code.ossystems Code Review - openembedded-core.git/commit
ldconfig-native: Fix ELF flags on 64-bit binaries
authorClemens Lang <clemens.lang@bmw-carit.de>
Wed, 30 Mar 2016 13:22:49 +0000 (15:22 +0200)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Thu, 31 Mar 2016 12:17:58 +0000 (13:17 +0100)
commitbf9c1e6fa1c8eb86670383bad9b7c2e54bfe17f4
treeab10641ec10c305130119abafeaf6f17ba77d12d
parente3fc8ef152494e9b7cff8de110a784150295f17e
ldconfig-native: Fix ELF flags on 64-bit binaries

Yocto's ldconfig-native was exported from an old version of glibc and
generates an ld.so.cache that is partially ignored by current versions
of glibc when loading libraries. This occurs for 64-bit binaries, where
glibc expects FLAG_ELF_LIBC6, but ldconfig-native only generates the
standard ELF flag. Fix this with an additional patch on top of the patch
for now.

You can verify this by applying the patch below to your target copy of
glibc and running

  LD_DEBUG=libs /lib64/ld-linux-x86-64.so.2 --list $anybinary

--- ./elf/dl-cache.c.orig       2016-01-07 11:05:36.823447171 +0100
+++ ./elf/dl-cache.c    2016-01-07 11:19:53.925878628 +0100
@@ -106,6 +106,8 @@
                if (_dl_cache_check_flags (flags)                             \
                    && _dl_cache_verify_ptr (lib->value))                     \
                  {                                                           \
+                   if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_LIBS))\
+                       _dl_debug_printf ("  considering file %s\n", cache_data + lib->value); \
                    if (best == NULL || flags == GLRO(dl_correct_cache_id))   \
                      {                                                       \
                        HWCAP_CHECK;                                          \
@@ -117,6 +119,9 @@
                             searching.  */                                   \
                          break;                                              \
                      }                                                       \
+                 } else {                                                    \
+                     if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_LIBS))              \
+                       _dl_debug_printf ("  ignoring file %s due to flags %x, expected %x\n", cache_data + lib->value, lib->flags, GLRO(dl_correct_cache_id)); \
                  }                                                           \
              }                                                               \
            while (++middle <= right);                                        \
@@ -265,14 +270,23 @@

       /* Only accept hwcap if it's for the right platform.  */
 #define HWCAP_CHECK \
-      if (lib->hwcap & hwcap_exclude)                                        \
+      if (lib->hwcap & hwcap_exclude) {                                              \
+       if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_LIBS))            \
+           _dl_debug_printf ("   hwcap mismatch %x vs. %x\n", lib->hwcap, hwcap_exclude); \
        continue;                                                             \
-      if (GLRO(dl_osversion) && lib->osversion > GLRO(dl_osversion))         \
+      }                                                                              \
+      if (GLRO(dl_osversion) && lib->osversion > GLRO(dl_osversion)) {       \
+       if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_LIBS))            \
+           _dl_debug_printf ("   os version mismatch %x vs. %x\n", lib->osversion, GLRO(dl_osversion)); \
        continue;                                                             \
+      }                                                                              \
       if (_DL_PLATFORMS_COUNT                                                \
          && (lib->hwcap & _DL_HWCAP_PLATFORM) != 0                           \
-         && (lib->hwcap & _DL_HWCAP_PLATFORM) != platform)                   \
-       continue
+         && (lib->hwcap & _DL_HWCAP_PLATFORM) != platform) {                 \
+       if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_LIBS))            \
+           _dl_debug_printf ("   platform mismatch %x vs. %x\n", lib->hwcap & _DL_HWCAP_PLATFORM, platform); \
+       continue;                                                             \
+      }
       SEARCH_CACHE (cache_new);
     }
   else

This version of ldconfig-native should really be replaced with a version
matching the glibc source in use on the target platform.

Signed-off-by: Clemens Lang <clemens.lang@bmw-carit.de>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
meta/recipes-core/glibc/ldconfig-native-2.12.1/add-64-bit-flag-for-ELF64-entries.patch