| commit 647103ea3a2aae2e6791b3bebe9e33eedc168102 |
| Author: Florian Weimer <fweimer@redhat.com> |
| Date: Fri Oct 9 10:13:14 2020 +0200 |
| |
| elf: Enhance ld.so --help to print HWCAP subdirectories |
| |
| Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> |
| |
| diff --git a/elf/dl-usage.c b/elf/dl-usage.c |
| index 8d39bc9d5442bc59..c07f43835bd771cf 100644 |
| |
| |
| @@ -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); |
| } |