diff mbox series

[v3,3/8] elf: Remove legacy hwcaps support from ldconfig

Message ID 20220927200645.eeb9a0d2c2864f03fec3d1ca@otheo.eu
State New
Headers show
Series Remove legacy hwcaps support | expand

Commit Message

Javier Pello Sept. 27, 2022, 6:06 p.m. UTC
Remove support for the legacy hwcaps subdirectories from ldconfig.

Signed-off-by: Javier Pello <devel@otheo.eu>
---
 elf/ldconfig.c | 155 ++++---------------------------------------------
 1 file changed, 10 insertions(+), 145 deletions(-)

Comments

Adhemerval Zanella Netto Oct. 3, 2022, 3:31 p.m. UTC | #1
On 27/09/22 15:06, Javier Pello wrote:
> Remove support for the legacy hwcaps subdirectories from ldconfig.
> 
> Signed-off-by: Javier Pello <devel@otheo.eu>

LGTM, thanks.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

> ---
>  elf/ldconfig.c | 155 ++++---------------------------------------------
>  1 file changed, 10 insertions(+), 145 deletions(-)
> 
> diff --git a/elf/ldconfig.c b/elf/ldconfig.c
> index 6f37f38f..0d19d847 100644
> --- a/elf/ldconfig.c
> +++ b/elf/ldconfig.c
> @@ -46,16 +46,6 @@
>  
>  #include <dl-procinfo.h>
>  
> -/* This subpath in search path entries is always supported and
> -   included in the cache for backwards compatibility.  */
> -#define TLS_SUBPATH "tls"
> -
> -/* The MSB of the hwcap field is set for objects in TLS_SUBPATH
> -   directories.  There is always TLS support in glibc, so the dynamic
> -   loader does not check the bit directly.  But more hwcap bits make a
> -   an object more preferred, so the bit still has meaning.  */
> -#define TLS_HWCAP_BIT 63
> -
>  #ifndef LD_SO_CONF
>  # define LD_SO_CONF SYSCONFDIR "/ld.so.conf"
>  #endif
> @@ -120,9 +110,6 @@ static char *cache_file;
>  /* Configuration file.  */
>  static const char *config_file;
>  
> -/* Mask to use for important hardware capabilities.  */
> -static unsigned long int hwcap_mask = HWCAP_IMPORTANT;
> -
>  /* Name and version of program.  */
>  static void print_version (FILE *stream, struct argp_state *state);
>  void (*argp_program_version_hook) (FILE *, struct argp_state *)
> @@ -163,75 +150,6 @@ static struct argp argp =
>    options, parse_opt, NULL, doc, NULL, more_help, NULL
>  };
>  
> -/* Check if string corresponds to an important hardware capability or
> -   a platform.  */
> -static int
> -is_hwcap_platform (const char *name)
> -{
> -  int hwcap_idx = _dl_string_hwcap (name);
> -
> -  /* Is this a normal hwcap for the machine like "fpu?"  */
> -  if (hwcap_idx != -1 && ((1 << hwcap_idx) & hwcap_mask))
> -    return 1;
> -
> -  /* Is this a platform pseudo-hwcap like "i686?"  */
> -  hwcap_idx = _dl_string_platform (name);
> -  if (hwcap_idx != -1)
> -    return 1;
> -
> -  /* Backwards-compatibility for the "tls" subdirectory.  */
> -  if (strcmp (name, TLS_SUBPATH) == 0)
> -    return 1;
> -
> -  return 0;
> -}
> -
> -/* Get hwcap (including platform) encoding of path.  */
> -static uint64_t
> -path_hwcap (const char *path)
> -{
> -  char *str = xstrdup (path);
> -  char *ptr;
> -  uint64_t hwcap = 0;
> -  uint64_t h;
> -
> -  size_t len;
> -
> -  len = strlen (str);
> -  if (str[len] == '/')
> -    str[len] = '\0';
> -
> -  /* Search pathname from the end and check for hwcap strings.  */
> -  for (;;)
> -    {
> -      ptr = strrchr (str, '/');
> -
> -      if (ptr == NULL)
> -	break;
> -
> -      h = _dl_string_hwcap (ptr + 1);
> -
> -      if (h == (uint64_t) -1)
> -	{
> -	  h = _dl_string_platform (ptr + 1);
> -	  if (h == (uint64_t) -1)
> -	    {
> -	      if (strcmp (ptr + 1, TLS_SUBPATH) == 0)
> -		h = TLS_HWCAP_BIT;
> -	      else
> -		break;
> -	    }
> -	}
> -      hwcap += 1ULL << h;
> -
> -      /* Search the next part of the path.  */
> -      *ptr = '\0';
> -    }
> -
> -  free (str);
> -  return hwcap;
> -}
> -
>  /* Handle program arguments.  */
>  static error_t
>  parse_opt (int key, char *arg, struct argp_state *state)
> @@ -747,27 +665,15 @@ struct dlib_entry
>  static void
>  search_dir (const struct dir_entry *entry)
>  {
> -  uint64_t hwcap;
> -  if (entry->hwcaps == NULL)
> -    {
> -      hwcap = path_hwcap (entry->path);
> -      if (opt_verbose)
> -	{
> -	  if (hwcap != 0)
> -	    printf ("%s: (hwcap: %#.16" PRIx64 ")", entry->path, hwcap);
> -	  else
> -	    printf ("%s:", entry->path);
> -	}
> -    }
> -  else
> +  if (opt_verbose)
>      {
> -      hwcap = 0;
> -      if (opt_verbose)
> +      if (entry->hwcaps == NULL)
> +	printf ("%s:", entry->path);
> +      else
>  	printf ("%s: (hwcap: \"%s\")", entry->path,
>  		glibc_hwcaps_subdirectory_name (entry->hwcaps));
> +      printf (_(" (from %s:%d)\n"), entry->from_file, entry->from_line);
>      }
> -  if (opt_verbose)
> -    printf (_(" (from %s:%d)\n"), entry->from_file, entry->from_line);
>  
>    char *dir_name;
>    char *real_file_name;
> @@ -808,14 +714,10 @@ search_dir (const struct dir_entry *entry)
>  	  && direntry->d_type != DT_REG
>  	  && direntry->d_type != DT_DIR)
>  	continue;
> -      /* Does this file look like a shared library or is it a hwcap
> -	 subdirectory (if not already processing a glibc-hwcaps
> -	 subdirectory)?  The dynamic linker is also considered as
> -	 shared library.  */
> +      /* Does this file look like a shared library?  The dynamic linker
> +	 is also considered as shared library.  */
>        if (!_dl_is_dso (direntry->d_name)
> -	  && (direntry->d_type == DT_REG
> -	      || (entry->hwcaps == NULL
> -		  && !is_hwcap_platform (direntry->d_name))))
> +	  && (direntry->d_type == DT_REG || entry->hwcaps == NULL))
>  	continue;
>  
>        size_t len = strlen (direntry->d_name);
> @@ -863,7 +765,6 @@ search_dir (const struct dir_entry *entry)
>  	  }
>  
>        struct stat stat_buf;
> -      bool is_dir;
>        int is_link = S_ISLNK (lstat_buf.st_mode);
>        if (is_link)
>  	{
> @@ -898,37 +799,13 @@ search_dir (const struct dir_entry *entry)
>  	  if (opt_chroot != NULL)
>  	    free (target_name);
>  
> -	  is_dir = S_ISDIR (stat_buf.st_mode);
> -
>  	  /* lstat_buf is later stored, update contents.  */
>  	  lstat_buf.st_dev = stat_buf.st_dev;
>  	  lstat_buf.st_ino = stat_buf.st_ino;
>  	  lstat_buf.st_size = stat_buf.st_size;
>  	  lstat_buf.st_ctime = stat_buf.st_ctime;
>  	}
> -      else
> -	is_dir = S_ISDIR (lstat_buf.st_mode);
> -
> -      /* No descending into subdirectories if this directory is a
> -	 glibc-hwcaps subdirectory (which are not recursive).  */
> -      if (entry->hwcaps == NULL
> -	  && is_dir && is_hwcap_platform (direntry->d_name))
> -	{
> -	  if (!is_link
> -	      && direntry->d_type != DT_UNKNOWN
> -	      && __builtin_expect (lstat (real_file_name, &lstat_buf), 0))
> -	    {
> -	      error (0, errno, _("Cannot lstat %s"), file_name);
> -	      continue;
> -	    }
> -
> -	  /* Handle subdirectory later.  */
> -	  struct dir_entry *new_entry = new_sub_entry (entry, file_name,
> -						       &lstat_buf);
> -	  add_single_dir (new_entry, 0);
> -	  continue;
> -	}
> -      else if (!S_ISREG (lstat_buf.st_mode) && !is_link)
> +      else if (!S_ISREG (lstat_buf.st_mode))
>  	continue;
>  
>        char *real_name;
> @@ -1103,7 +980,7 @@ search_dir (const struct dir_entry *entry)
>  	}
>        if (opt_build_cache)
>  	add_to_cache (entry->path, filename, dlib_ptr->soname,
> -		      dlib_ptr->flag, dlib_ptr->isa_level, hwcap,
> +		      dlib_ptr->flag, dlib_ptr->isa_level, 0,
>  		      entry->hwcaps);
>      }
>  
> @@ -1290,16 +1167,6 @@ parse_conf_include (const char *config_file, unsigned int lineno,
>    free (copy);
>  }
>  
> -/* Honour LD_HWCAP_MASK.  */
> -static void
> -set_hwcap (void)
> -{
> -  char *mask = getenv ("LD_HWCAP_MASK");
> -
> -  if (mask)
> -    hwcap_mask = strtoul (mask, NULL, 0);
> -}
> -
>  
>  int
>  main (int argc, char **argv)
> @@ -1332,8 +1199,6 @@ main (int argc, char **argv)
>  	  add_dir_1 (argv[i], "<cmdline>", 0);
>      }
>  
> -  set_hwcap ();
> -
>    if (opt_chroot != NULL)
>      {
>        /* Normalize the path a bit, we might need it for printing later.  */
diff mbox series

Patch

diff --git a/elf/ldconfig.c b/elf/ldconfig.c
index 6f37f38f..0d19d847 100644
--- a/elf/ldconfig.c
+++ b/elf/ldconfig.c
@@ -46,16 +46,6 @@ 
 
 #include <dl-procinfo.h>
 
-/* This subpath in search path entries is always supported and
-   included in the cache for backwards compatibility.  */
-#define TLS_SUBPATH "tls"
-
-/* The MSB of the hwcap field is set for objects in TLS_SUBPATH
-   directories.  There is always TLS support in glibc, so the dynamic
-   loader does not check the bit directly.  But more hwcap bits make a
-   an object more preferred, so the bit still has meaning.  */
-#define TLS_HWCAP_BIT 63
-
 #ifndef LD_SO_CONF
 # define LD_SO_CONF SYSCONFDIR "/ld.so.conf"
 #endif
@@ -120,9 +110,6 @@  static char *cache_file;
 /* Configuration file.  */
 static const char *config_file;
 
-/* Mask to use for important hardware capabilities.  */
-static unsigned long int hwcap_mask = HWCAP_IMPORTANT;
-
 /* Name and version of program.  */
 static void print_version (FILE *stream, struct argp_state *state);
 void (*argp_program_version_hook) (FILE *, struct argp_state *)
@@ -163,75 +150,6 @@  static struct argp argp =
   options, parse_opt, NULL, doc, NULL, more_help, NULL
 };
 
-/* Check if string corresponds to an important hardware capability or
-   a platform.  */
-static int
-is_hwcap_platform (const char *name)
-{
-  int hwcap_idx = _dl_string_hwcap (name);
-
-  /* Is this a normal hwcap for the machine like "fpu?"  */
-  if (hwcap_idx != -1 && ((1 << hwcap_idx) & hwcap_mask))
-    return 1;
-
-  /* Is this a platform pseudo-hwcap like "i686?"  */
-  hwcap_idx = _dl_string_platform (name);
-  if (hwcap_idx != -1)
-    return 1;
-
-  /* Backwards-compatibility for the "tls" subdirectory.  */
-  if (strcmp (name, TLS_SUBPATH) == 0)
-    return 1;
-
-  return 0;
-}
-
-/* Get hwcap (including platform) encoding of path.  */
-static uint64_t
-path_hwcap (const char *path)
-{
-  char *str = xstrdup (path);
-  char *ptr;
-  uint64_t hwcap = 0;
-  uint64_t h;
-
-  size_t len;
-
-  len = strlen (str);
-  if (str[len] == '/')
-    str[len] = '\0';
-
-  /* Search pathname from the end and check for hwcap strings.  */
-  for (;;)
-    {
-      ptr = strrchr (str, '/');
-
-      if (ptr == NULL)
-	break;
-
-      h = _dl_string_hwcap (ptr + 1);
-
-      if (h == (uint64_t) -1)
-	{
-	  h = _dl_string_platform (ptr + 1);
-	  if (h == (uint64_t) -1)
-	    {
-	      if (strcmp (ptr + 1, TLS_SUBPATH) == 0)
-		h = TLS_HWCAP_BIT;
-	      else
-		break;
-	    }
-	}
-      hwcap += 1ULL << h;
-
-      /* Search the next part of the path.  */
-      *ptr = '\0';
-    }
-
-  free (str);
-  return hwcap;
-}
-
 /* Handle program arguments.  */
 static error_t
 parse_opt (int key, char *arg, struct argp_state *state)
@@ -747,27 +665,15 @@  struct dlib_entry
 static void
 search_dir (const struct dir_entry *entry)
 {
-  uint64_t hwcap;
-  if (entry->hwcaps == NULL)
-    {
-      hwcap = path_hwcap (entry->path);
-      if (opt_verbose)
-	{
-	  if (hwcap != 0)
-	    printf ("%s: (hwcap: %#.16" PRIx64 ")", entry->path, hwcap);
-	  else
-	    printf ("%s:", entry->path);
-	}
-    }
-  else
+  if (opt_verbose)
     {
-      hwcap = 0;
-      if (opt_verbose)
+      if (entry->hwcaps == NULL)
+	printf ("%s:", entry->path);
+      else
 	printf ("%s: (hwcap: \"%s\")", entry->path,
 		glibc_hwcaps_subdirectory_name (entry->hwcaps));
+      printf (_(" (from %s:%d)\n"), entry->from_file, entry->from_line);
     }
-  if (opt_verbose)
-    printf (_(" (from %s:%d)\n"), entry->from_file, entry->from_line);
 
   char *dir_name;
   char *real_file_name;
@@ -808,14 +714,10 @@  search_dir (const struct dir_entry *entry)
 	  && direntry->d_type != DT_REG
 	  && direntry->d_type != DT_DIR)
 	continue;
-      /* Does this file look like a shared library or is it a hwcap
-	 subdirectory (if not already processing a glibc-hwcaps
-	 subdirectory)?  The dynamic linker is also considered as
-	 shared library.  */
+      /* Does this file look like a shared library?  The dynamic linker
+	 is also considered as shared library.  */
       if (!_dl_is_dso (direntry->d_name)
-	  && (direntry->d_type == DT_REG
-	      || (entry->hwcaps == NULL
-		  && !is_hwcap_platform (direntry->d_name))))
+	  && (direntry->d_type == DT_REG || entry->hwcaps == NULL))
 	continue;
 
       size_t len = strlen (direntry->d_name);
@@ -863,7 +765,6 @@  search_dir (const struct dir_entry *entry)
 	  }
 
       struct stat stat_buf;
-      bool is_dir;
       int is_link = S_ISLNK (lstat_buf.st_mode);
       if (is_link)
 	{
@@ -898,37 +799,13 @@  search_dir (const struct dir_entry *entry)
 	  if (opt_chroot != NULL)
 	    free (target_name);
 
-	  is_dir = S_ISDIR (stat_buf.st_mode);
-
 	  /* lstat_buf is later stored, update contents.  */
 	  lstat_buf.st_dev = stat_buf.st_dev;
 	  lstat_buf.st_ino = stat_buf.st_ino;
 	  lstat_buf.st_size = stat_buf.st_size;
 	  lstat_buf.st_ctime = stat_buf.st_ctime;
 	}
-      else
-	is_dir = S_ISDIR (lstat_buf.st_mode);
-
-      /* No descending into subdirectories if this directory is a
-	 glibc-hwcaps subdirectory (which are not recursive).  */
-      if (entry->hwcaps == NULL
-	  && is_dir && is_hwcap_platform (direntry->d_name))
-	{
-	  if (!is_link
-	      && direntry->d_type != DT_UNKNOWN
-	      && __builtin_expect (lstat (real_file_name, &lstat_buf), 0))
-	    {
-	      error (0, errno, _("Cannot lstat %s"), file_name);
-	      continue;
-	    }
-
-	  /* Handle subdirectory later.  */
-	  struct dir_entry *new_entry = new_sub_entry (entry, file_name,
-						       &lstat_buf);
-	  add_single_dir (new_entry, 0);
-	  continue;
-	}
-      else if (!S_ISREG (lstat_buf.st_mode) && !is_link)
+      else if (!S_ISREG (lstat_buf.st_mode))
 	continue;
 
       char *real_name;
@@ -1103,7 +980,7 @@  search_dir (const struct dir_entry *entry)
 	}
       if (opt_build_cache)
 	add_to_cache (entry->path, filename, dlib_ptr->soname,
-		      dlib_ptr->flag, dlib_ptr->isa_level, hwcap,
+		      dlib_ptr->flag, dlib_ptr->isa_level, 0,
 		      entry->hwcaps);
     }
 
@@ -1290,16 +1167,6 @@  parse_conf_include (const char *config_file, unsigned int lineno,
   free (copy);
 }
 
-/* Honour LD_HWCAP_MASK.  */
-static void
-set_hwcap (void)
-{
-  char *mask = getenv ("LD_HWCAP_MASK");
-
-  if (mask)
-    hwcap_mask = strtoul (mask, NULL, 0);
-}
-
 
 int
 main (int argc, char **argv)
@@ -1332,8 +1199,6 @@  main (int argc, char **argv)
 	  add_dir_1 (argv[i], "<cmdline>", 0);
     }
 
-  set_hwcap ();
-
   if (opt_chroot != NULL)
     {
       /* Normalize the path a bit, we might need it for printing later.  */