elf: Fix tests that rely on ld.so.cache for cross-compiling

Message ID 20210129133621.3729816-1-adhemerval.zanella@linaro.org
State Committed
Commit a50a080f6b0f958eb30d7520212f25f946ed7f8f
Headers
Series elf: Fix tests that rely on ld.so.cache for cross-compiling |

Commit Message

Adhemerval Zanella Jan. 29, 2021, 1:36 p.m. UTC
  For configurations with cross-compiling equal to 'maybe' or 'no',
ldconfig will not run and thus the ld.so.cache will not be created
on the container testroot.pristine.

This lead to failures on both tst-glibc-hwcaps-prepend-cache and
tst-ldconfig-ld_so_conf-update on environments where the same
compiler can be used to build different ABIs (powerpc and x86 for
instance).

This patch addas a new test-container hook, ldconfig.run, that
triggers a ldconfig execution prior the test execution.

Checked on x86_64-linux-gnu and i686-linux-gnu.
---
 .../ldconfig.run                              |  0
 .../ldconfig.run                              |  0
 support/test-container.c                      | 26 +++++++++++++++++++
 3 files changed, 26 insertions(+)
 create mode 100644 elf/tst-glibc-hwcaps-prepend-cache.root/ldconfig.run
 create mode 100644 elf/tst-ldconfig-ld_so_conf-update.root/ldconfig.run
  

Comments

Florian Weimer Jan. 29, 2021, 1:40 p.m. UTC | #1
* Adhemerval Zanella:

> For configurations with cross-compiling equal to 'maybe' or 'no',
> ldconfig will not run and thus the ld.so.cache will not be created
> on the container testroot.pristine.
>
> This lead to failures on both tst-glibc-hwcaps-prepend-cache and
> tst-ldconfig-ld_so_conf-update on environments where the same
> compiler can be used to build different ABIs (powerpc and x86 for
> instance).
>
> This patch addas a new test-container hook, ldconfig.run, that
> triggers a ldconfig execution prior the test execution.

Commit subject does not match patch: No tests are fixed yet, I think.

Should running ldconfig automatically trigger post-clean activities?

Place of the invocation of ldconfig in the patch looks right to me.

Thanks,
Florian
  
Adhemerval Zanella Jan. 29, 2021, 1:59 p.m. UTC | #2
On 29/01/2021 10:40, Florian Weimer wrote:
> * Adhemerval Zanella:
> 
>> For configurations with cross-compiling equal to 'maybe' or 'no',
>> ldconfig will not run and thus the ld.so.cache will not be created
>> on the container testroot.pristine.
>>
>> This lead to failures on both tst-glibc-hwcaps-prepend-cache and
>> tst-ldconfig-ld_so_conf-update on environments where the same
>> compiler can be used to build different ABIs (powerpc and x86 for
>> instance).
>>
>> This patch addas a new test-container hook, ldconfig.run, that
>> triggers a ldconfig execution prior the test execution.
> 
> Commit subject does not match patch: No tests are fixed yet, I think.

The fix is due the new two files:

  elf/tst-glibc-hwcaps-prepend-cache.root/ldconfig.run
  elf/tst-ldconfig-ld_so_conf-update.root/ldconfig.run

Otherwise in such described scenario ld.so.cache won't exist, the
tests will try to load it and failure will set the process to not
try to reload the cache (and then any ld.so.cache update won't change
dlopen outcome).

> 
> Should running ldconfig automatically trigger post-clean activities?

At least in such scenarios the ld.so.cache is already deleted, since
the sync with the pristine will detect the file existence.  Running
the tests with test-container -v I see:

sync /home/azanella/Projects/glibc/build/i686-linux-gnu/testroot.pristine/etc/ to /home/azanella/Projects/glibc/build/i686-linux-gnu/testroot.root/etc/ and delete
-F /home/azanella/Projects/glibc/build/i686-linux-gnu/testroot.root/etc/ld.so.conf
-F /home/azanella/Projects/glibc/build/i686-linux-gnu/testroot.root/etc/ld.so.cache

> 
> Place of the invocation of ldconfig in the patch looks right to me.
> 
> Thanks,
> Florian
>
  
Florian Weimer Jan. 29, 2021, 4:38 p.m. UTC | #3
* Adhemerval Zanella:

>> Commit subject does not match patch: No tests are fixed yet, I think.
>
> The fix is due the new two files:
>
>   elf/tst-glibc-hwcaps-prepend-cache.root/ldconfig.run
>   elf/tst-ldconfig-ld_so_conf-update.root/ldconfig.run

I did look for them but really didn't see them due the way my mail
client marks up diffs. 8-(  Patch looks okay to me then.

Thanks,
Florian
  

Patch

diff --git a/elf/tst-glibc-hwcaps-prepend-cache.root/ldconfig.run b/elf/tst-glibc-hwcaps-prepend-cache.root/ldconfig.run
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/elf/tst-ldconfig-ld_so_conf-update.root/ldconfig.run b/elf/tst-ldconfig-ld_so_conf-update.root/ldconfig.run
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/support/test-container.c b/support/test-container.c
index 8b6ce86da9..28cc44d9f1 100644
--- a/support/test-container.c
+++ b/support/test-container.c
@@ -45,6 +45,7 @@ 
 
 #include <support/support.h>
 #include <support/xunistd.h>
+#include <support/capture_subprocess.h>
 #include "check.h"
 #include "test-driver.h"
 
@@ -83,6 +84,7 @@  int verbose = 0;
    * copy support files and test binary
    * chroot/unshare
    * set up any mounts (like /proc)
+   * run ldconfig
 
    Magic files:
 
@@ -131,6 +133,9 @@  int verbose = 0;
    * mytest.root/postclean.req causes fresh rsync (with delete) after
      test if present
 
+   * mytest.root/ldconfig.run causes ldconfig to be issued prior
+     test execution (to setup the initial ld.so.cache).
+
    Note that $srcdir/foo/mytest.script may be used instead of a
    $srcdir/foo/mytest.root/mytest.script in the sysroot template, if
    there is no other reason for a sysroot.
@@ -684,6 +689,16 @@  check_for_unshare_hints (void)
     }
 }
 
+static void
+run_ldconfig (void *x __attribute__((unused)))
+{
+  char *prog = xasprintf ("%s/ldconfig", support_install_rootsbindir);
+  char *args[] = { prog, NULL };
+
+  execv (args[0], args);
+  FAIL_EXIT1 ("execv: %m");
+}
+
 int
 main (int argc, char **argv)
 {
@@ -700,6 +715,7 @@  main (int argc, char **argv)
   char *command_basename;
   char *so_base;
   int do_postclean = 0;
+  bool do_ldconfig = false;
   char *change_cwd = NULL;
 
   int pipes[2];
@@ -826,6 +842,9 @@  main (int argc, char **argv)
   if (file_exists (concat (command_root, "/postclean.req", NULL)))
     do_postclean = 1;
 
+  if (file_exists (concat (command_root, "/ldconfig.run", NULL)))
+    do_ldconfig = true;
+
   rsync (pristine_root_path, new_root_path,
 	 file_exists (concat (command_root, "/preclean.req", NULL)));
 
@@ -1126,6 +1145,13 @@  main (int argc, char **argv)
   /* The rest is the child process, which is now PID 1 and "in" the
      new root.  */
 
+  if (do_ldconfig)
+    {
+      struct support_capture_subprocess result =
+        support_capture_subprocess (run_ldconfig, NULL);
+      support_capture_subprocess_check (&result, "execv", 0, sc_allow_none);
+    }
+
   /* Get our "outside" pid from our parent.  We use this to help with
      debugging from outside the container.  */
   read (pipes[0], &child, sizeof(child));