elf: Enhance ld.so --help to print HWCAP subdirectories

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
This commit is contained in:
Florian Weimer 2020-10-09 10:13:14 +02:00
parent 10b39a5124
commit 647103ea3a

View File

@ -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);
}