diff options
author | Florian Weimer <fweimer@redhat.com> | 2020-10-09 10:13:14 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2020-10-09 10:21:32 +0200 |
commit | 647103ea3a2aae2e6791b3bebe9e33eedc168102 (patch) | |
tree | 910728b52b381b32a387227ce9dc77b49ccf7376 | |
parent | 10b39a5124aea509dfeef2f39a0835adb0fb2296 (diff) | |
download | glibc-647103ea3a2aae2e6791b3bebe9e33eedc168102.tar glibc-647103ea3a2aae2e6791b3bebe9e33eedc168102.tar.gz glibc-647103ea3a2aae2e6791b3bebe9e33eedc168102.tar.bz2 glibc-647103ea3a2aae2e6791b3bebe9e33eedc168102.zip |
elf: Enhance ld.so --help to print HWCAP subdirectories
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
-rw-r--r-- | elf/dl-usage.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/elf/dl-usage.c b/elf/dl-usage.c index 8d39bc9d54..c07f43835b 100644 --- a/elf/dl-usage.c +++ b/elf/dl-usage.c @@ -22,6 +22,8 @@ #include <unistd.h> #include "version.h" +#include <dl-hwcaps.h> + void _dl_usage (const char *argv0, const char *wrong_option) { @@ -101,6 +103,65 @@ print_search_path_for_help (struct dl_main_state *state) print_search_path_for_help_1 (__rtld_search_dirs.dirs); } +/* Helper function for printing flags associated with a HWCAP name. */ +static void +print_hwcap_1 (bool *first, bool active, const char *label) +{ + if (active) + { + if (*first) + { + _dl_printf (" ("); + *first = false; + } + else + _dl_printf (", "); + _dl_printf ("%s", label); + } +} + +/* Called after a series of print_hwcap_1 calls to emit the line + terminator. */ +static void +print_hwcap_1_finish (bool *first) +{ + if (*first) + _dl_printf ("\n"); + else + _dl_printf (")\n"); +} + +/* Write a list of hwcap subdirectories to standard output. See + _dl_important_hwcaps in dl-hwcaps.c. */ +static void +print_legacy_hwcap_directories (void) +{ + _dl_printf ("\n\ +Legacy HWCAP subdirectories under library search path directories:\n"); + + const char *platform = GLRO (dl_platform); + if (platform != NULL) + _dl_printf (" %s (AT_PLATFORM; supported, searched)\n", platform); + + _dl_printf (" tls (supported, searched)\n"); + + uint64_t hwcap_mask = GET_HWCAP_MASK(); + uint64_t searched = GLRO (dl_hwcap) & hwcap_mask; + for (int n = 63; n >= 0; --n) + { + uint64_t bit = 1ULL << n; + if (HWCAP_IMPORTANT & bit) + { + _dl_printf (" %s", _dl_hwcap_string (n)); + bool first = true; + print_hwcap_1 (&first, GLRO (dl_hwcap) & bit, "supported"); + print_hwcap_1 (&first, !(hwcap_mask & bit), "masked"); + print_hwcap_1 (&first, searched & bit, "searched"); + print_hwcap_1_finish (&first); + } + } +} + void _dl_help (const char *argv0, struct dl_main_state *state) { @@ -136,5 +197,6 @@ This program interpreter self-identifies as: " RTLD "\n\ ", argv0); print_search_path_for_help (state); + print_legacy_hwcap_directories (); _exit (EXIT_SUCCESS); } |