elf: Fix tests that rely on ld.so.cache for cross-compiling
Commit Message
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
* 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
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
>
* 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
new file mode 100644
new file mode 100644
@@ -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));