[RFC] Remove special flags of libc.5.so and libc.4.so

Message ID 20211222153151.162136-1-lamm@linux.ibm.com
State New, archived
Headers
Series [RFC] Remove special flags of libc.5.so and libc.4.so |

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent
dj/TryBot-32bit success Build for i686

Commit Message

Lucas A. M. Magalhaes Dec. 22, 2021, 3:31 p.m. UTC
  I've tested it in a AT build and was able to build and link programs as
expected. For other archs I try with build-many-glibcs.py, all
succeeded.

Any other suggestions on how to test this?

Florian am I missing something? Should we add a restriction to cache
just new libc6.so compatible libraries?

-- 8< --

The older libcs version are obsolete for over twenty years now. This
commit removes special flags of libc.5.so and libc.4.so.. It assume that
all libraries cached are libc.6.so compatible and wrote FLAG_ELF_LIBC6.

Tested on x86_64, powerpc, powerpc64 and powerpc64le.
Tested with build-many-glibcs.py for the other affected architectures.
---
 elf/cache.c                                |  6 +--
 elf/ldconfig.c                             | 33 +---------------
 elf/readelflib.c                           | 46 +++-------------------
 elf/readlib.c                              | 25 +-----------
 sysdeps/unix/sysv/linux/arc/ldconfig.h     |  8 ----
 sysdeps/unix/sysv/linux/arm/ldconfig.h     |  7 ----
 sysdeps/unix/sysv/linux/csky/ldconfig.h    |  6 ---
 sysdeps/unix/sysv/linux/ia64/ldconfig.h    |  6 ---
 sysdeps/unix/sysv/linux/powerpc/ldconfig.h |  8 ----
 sysdeps/unix/sysv/linux/riscv/ldconfig.h   | 17 --------
 sysdeps/unix/sysv/linux/s390/ldconfig.h    |  7 ----
 sysdeps/unix/sysv/linux/x86_64/ldconfig.h  |  8 ----
 12 files changed, 11 insertions(+), 166 deletions(-)
  

Comments

Lucas A. M. Magalhaes Jan. 10, 2022, 7:21 p.m. UTC | #1
Ping.

Quoting Lucas A. M. Magalhaes via Libc-alpha (2021-12-22 12:31:51)
> I've tested it in a AT build and was able to build and link programs as
> expected. For other archs I try with build-many-glibcs.py, all
> succeeded.
> 
> Any other suggestions on how to test this?
> 
> Florian am I missing something? Should we add a restriction to cache
> just new libc6.so compatible libraries?
> 
> -- 8< --
> 
> The older libcs version are obsolete for over twenty years now. This
> commit removes special flags of libc.5.so and libc.4.so.. It assume that
> all libraries cached are libc.6.so compatible and wrote FLAG_ELF_LIBC6.
> 
> Tested on x86_64, powerpc, powerpc64 and powerpc64le.
> Tested with build-many-glibcs.py for the other affected architectures.
> ---
>  elf/cache.c                                |  6 +--
>  elf/ldconfig.c                             | 33 +---------------
>  elf/readelflib.c                           | 46 +++-------------------
>  elf/readlib.c                              | 25 +-----------
>  sysdeps/unix/sysv/linux/arc/ldconfig.h     |  8 ----
>  sysdeps/unix/sysv/linux/arm/ldconfig.h     |  7 ----
>  sysdeps/unix/sysv/linux/csky/ldconfig.h    |  6 ---
>  sysdeps/unix/sysv/linux/ia64/ldconfig.h    |  6 ---
>  sysdeps/unix/sysv/linux/powerpc/ldconfig.h |  8 ----
>  sysdeps/unix/sysv/linux/riscv/ldconfig.h   | 17 --------
>  sysdeps/unix/sysv/linux/s390/ldconfig.h    |  7 ----
>  sysdeps/unix/sysv/linux/x86_64/ldconfig.h  |  8 ----
>  12 files changed, 11 insertions(+), 166 deletions(-)
> 
> diff --git a/elf/cache.c b/elf/cache.c
> index 1c0dc5ee87..387dd11a05 100644
> --- a/elf/cache.c
> +++ b/elf/cache.c
> @@ -158,6 +158,7 @@ struct cache_entry
>  /* List of all cache entries.  */
>  static struct cache_entry *entries;
>  
> +/* libc4, ELF and libc5 are unsupported */
>  static const char *flag_descr[] =
>  { "libc4", "ELF", "libc5", "libc6"};
>  
> @@ -169,14 +170,11 @@ print_entry (const char *lib, int flag, unsigned int osversion,
>    printf ("\t%s (", lib);
>    switch (flag & FLAG_TYPE_MASK)
>      {
> -    case FLAG_LIBC4:
> -    case FLAG_ELF:
> -    case FLAG_ELF_LIBC5:
>      case FLAG_ELF_LIBC6:
>        fputs (flag_descr[flag & FLAG_TYPE_MASK], stdout);
>        break;
>      default:
> -      fputs (_("unknown"), stdout);
> +      fputs (_("Unknown or unsupported flag"), stdout);
>        break;
>      }
>    switch (flag & FLAG_REQUIRED_MASK)
> diff --git a/elf/ldconfig.c b/elf/ldconfig.c
> index 101d56ac8e..d64b134781 100644
> --- a/elf/ldconfig.c
> +++ b/elf/ldconfig.c
> @@ -65,19 +65,6 @@
>  
>  #define PACKAGE _libc_intl_domainname
>  
> -static const struct
> -{
> -  const char *name;
> -  int flag;
> -} lib_types[] =
> -{
> -  {"libc4", FLAG_LIBC4},
> -  {"libc5", FLAG_ELF_LIBC5},
> -  {"libc6", FLAG_ELF_LIBC6},
> -  {"glibc2", FLAG_ELF_LIBC6}
> -};
> -
> -
>  /* List of directories to handle.  */
>  struct dir_entry
>  {
> @@ -471,25 +458,7 @@ add_dir_1 (const char *line, const char *from_file, int from_line)
>  
>    /* Search for an '=' sign.  */
>    entry->path = xstrdup (line);
> -  char *equal_sign = strchr (entry->path, '=');
> -  if (equal_sign)
> -    {
> -      *equal_sign = '\0';
> -      ++equal_sign;
> -      entry->flag = FLAG_ANY;
> -      for (i = 0; i < sizeof (lib_types) / sizeof (lib_types[0]); ++i)
> -       if (strcmp (equal_sign, lib_types[i].name) == 0)
> -         {
> -           entry->flag = lib_types[i].flag;
> -           break;
> -         }
> -      if (entry->flag == FLAG_ANY)
> -       error (0, 0, _("%s is not a known library type"), equal_sign);
> -    }
> -  else
> -    {
> -      entry->flag = FLAG_ANY;
> -    }
> +  entry->flag = FLAG_ELF_LIBC6;
>  
>    /* Canonify path: for now only remove leading and trailing
>       whitespace and the trailing slashes.  */
> diff --git a/elf/readelflib.c b/elf/readelflib.c
> index 10b10b6080..801c5587ab 100644
> --- a/elf/readelflib.c
> +++ b/elf/readelflib.c
> @@ -44,7 +44,6 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
>                   char **soname, void *file_contents, size_t file_length)
>  {
>    int i;
> -  unsigned int j;
>    unsigned int dynamic_addr;
>    size_t dynamic_size;
>    char *program_interpreter;
> @@ -82,9 +81,8 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
>    elf_pheader = (ElfW(Phdr) *) (elf_header->e_phoff + file_contents);
>    check_ptr (elf_pheader);
>  
> -  /* The library is an elf library, now search for soname and
> -     libc5/libc6.  */
> -  *flag = FLAG_ELF;
> +  /* The library is an elf library   */
> +  *flag = FLAG_ELF_LIBC6;
>  
>    /* The default ISA level is 0.  */
>    *isa_level = 0;
> @@ -111,16 +109,6 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
>           program_interpreter = (char *) (file_contents + segment->p_offset);
>           check_ptr (program_interpreter);
>  
> -         /* Check if this is enough to classify the binary.  */
> -         for (j = 0; j < sizeof (interpreters) / sizeof (interpreters [0]);
> -              ++j)
> -           if (strcmp (program_interpreter, interpreters[j].soname) == 0)
> -             {
> -               *flag = interpreters[j].flag;
> -               break;
> -             }
> -         break;
> -
>         case PT_NOTE:
>           if (!*osversion && segment->p_filesz >= 32 && segment->p_align >= 4)
>             {
> @@ -291,38 +279,16 @@ done:
>    if (dynamic_strings == NULL)
>      return 1;
>  
> -  /* Now read the DT_NEEDED and DT_SONAME entries.  */
> +  /* Now read the DT_SONAME entries.  */
>    for (dyn_entry = dynamic_segment; dyn_entry->d_tag != DT_NULL;
>         ++dyn_entry)
>      {
> -      if (dyn_entry->d_tag == DT_NEEDED || dyn_entry->d_tag == DT_SONAME)
> +      if (dyn_entry->d_tag == DT_SONAME)
>         {
>           char *name = dynamic_strings + dyn_entry->d_un.d_val;
>           check_ptr (name);
> -
> -         if (dyn_entry->d_tag == DT_NEEDED)
> -           {
> -
> -             if (*flag == FLAG_ELF)
> -               {
> -                 /* Check if this is enough to classify the binary.  */
> -                 for (j = 0;
> -                      j < sizeof (known_libs) / sizeof (known_libs [0]);
> -                      ++j)
> -                   if (strcmp (name, known_libs [j].soname) == 0)
> -                     {
> -                       *flag = known_libs [j].flag;
> -                       break;
> -                     }
> -               }
> -           }
> -
> -         else if (dyn_entry->d_tag == DT_SONAME)
> -           *soname = xstrdup (name);
> -
> -         /* Do we have everything we need?  */
> -         if (*soname && *flag != FLAG_ELF)
> -           return 0;
> +          *soname = xstrdup (name);
> +          return 0;
>         }
>      }
>  
> diff --git a/elf/readlib.c b/elf/readlib.c
> index 64b20d7804..9164c1cda7 100644
> --- a/elf/readlib.c
> +++ b/elf/readlib.c
> @@ -43,24 +43,6 @@ struct known_names
>    int flag;
>  };
>  
> -static struct known_names interpreters[] =
> -{
> -  { "/lib/" LD_SO, FLAG_ELF_LIBC6 },
> -#ifdef SYSDEP_KNOWN_INTERPRETER_NAMES
> -  SYSDEP_KNOWN_INTERPRETER_NAMES
> -#endif
> -};
> -
> -static struct known_names known_libs[] =
> -{
> -  { LIBC_SO, FLAG_ELF_LIBC6 },
> -  { LIBM_SO, FLAG_ELF_LIBC6 },
> -#ifdef SYSDEP_KNOWN_LIBRARY_NAMES
> -  SYSDEP_KNOWN_LIBRARY_NAMES
> -#endif
> -};
> -
> -
>  /* Check if string corresponds to a GDB Python file.  */
>  static bool
>  is_gdb_python_file (const char *name)
> @@ -84,7 +66,8 @@ process_file (const char *real_file_name, const char *file_name,
>    struct exec *aout_header;
>  
>    ret = 0;
> -  *flag = FLAG_ANY;
> +  /* Just set FLAG_ELF_LIBC6 as old formats are not supported anymore.  */
> +  *flag = FLAG_ELF_LIBC6;
>    *soname = NULL;
>  
>    file = fopen (real_file_name, "rb");
> @@ -151,7 +134,6 @@ process_file (const char *real_file_name, const char *file_name,
>             *dot = '\0';
>         }
>        *soname = copy;
> -      *flag = FLAG_LIBC4;
>        goto done;
>      }
>  
> @@ -192,9 +174,6 @@ implicit_soname (const char *lib, int flag)
>  {
>    char *soname = xstrdup (lib);
>  
> -  if ((flag & FLAG_TYPE_MASK) != FLAG_LIBC4)
> -    return soname;
> -
>    /* Aout files don't have a soname, just return the name
>       including the major number.  */
>    char *major = strstr (soname, ".so.");
> diff --git a/sysdeps/unix/sysv/linux/arc/ldconfig.h b/sysdeps/unix/sysv/linux/arc/ldconfig.h
> index 8c776fca9e..02ed826283 100644
> --- a/sysdeps/unix/sysv/linux/arc/ldconfig.h
> +++ b/sysdeps/unix/sysv/linux/arc/ldconfig.h
> @@ -17,11 +17,3 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdeps/generic/ldconfig.h>
> -
> -#define SYSDEP_KNOWN_INTERPRETER_NAMES                 \
> -  { "/lib/ld-linux-arc.so.2", FLAG_ELF_LIBC6 },        \
> -  { "/lib/ld-linux-arceb.so.2", FLAG_ELF_LIBC6 },
> -
> -#define SYSDEP_KNOWN_LIBRARY_NAMES     \
> -  { "libc.so.6", FLAG_ELF_LIBC6 },     \
> -  { "libm.so.6", FLAG_ELF_LIBC6 },
> diff --git a/sysdeps/unix/sysv/linux/arm/ldconfig.h b/sysdeps/unix/sysv/linux/arm/ldconfig.h
> index d839470cfe..b3fa8ceebe 100644
> --- a/sysdeps/unix/sysv/linux/arm/ldconfig.h
> +++ b/sysdeps/unix/sysv/linux/arm/ldconfig.h
> @@ -16,10 +16,3 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdeps/generic/ldconfig.h>
> -
> -#define SYSDEP_KNOWN_INTERPRETER_NAMES \
> -  { "/lib/ld-linux.so.3", FLAG_ELF_LIBC6 }, \
> -  { "/lib/ld-linux-armhf.so.3", FLAG_ELF_LIBC6 },
> -#define SYSDEP_KNOWN_LIBRARY_NAMES \
> -  { "libc.so.6", FLAG_ELF_LIBC6 },     \
> -  { "libm.so.6", FLAG_ELF_LIBC6 },
> diff --git a/sysdeps/unix/sysv/linux/csky/ldconfig.h b/sysdeps/unix/sysv/linux/csky/ldconfig.h
> index eeda37e4a8..6861f71327 100644
> --- a/sysdeps/unix/sysv/linux/csky/ldconfig.h
> +++ b/sysdeps/unix/sysv/linux/csky/ldconfig.h
> @@ -26,9 +26,3 @@
>  #else
>  # define LD_SO_ABI "cskyv2"
>  #endif
> -
> -#define SYSDEP_KNOWN_INTERPRETER_NAMES \
> -  { LD_SO_PREFIX LD_SO_ABI LD_SO_SUFFIX, FLAG_ELF_LIBC6 },
> -#define SYSDEP_KNOWN_LIBRARY_NAMES     \
> -  { "libc.so.6", FLAG_ELF_LIBC6 },     \
> -  { "libm.so.6", FLAG_ELF_LIBC6 },
> diff --git a/sysdeps/unix/sysv/linux/ia64/ldconfig.h b/sysdeps/unix/sysv/linux/ia64/ldconfig.h
> index 53685659ed..b3fa8ceebe 100644
> --- a/sysdeps/unix/sysv/linux/ia64/ldconfig.h
> +++ b/sysdeps/unix/sysv/linux/ia64/ldconfig.h
> @@ -16,9 +16,3 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdeps/generic/ldconfig.h>
> -
> -#define SYSDEP_KNOWN_INTERPRETER_NAMES \
> -  { "/lib/ld-linux.so.2", FLAG_ELF_LIBC6 },
> -#define SYSDEP_KNOWN_LIBRARY_NAMES \
> -  { "libc.so.6", FLAG_ELF_LIBC6 },     \
> -  { "libm.so.6", FLAG_ELF_LIBC6 },
> diff --git a/sysdeps/unix/sysv/linux/powerpc/ldconfig.h b/sysdeps/unix/sysv/linux/powerpc/ldconfig.h
> index 09d75b3dec..d0935d541b 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/ldconfig.h
> +++ b/sysdeps/unix/sysv/linux/powerpc/ldconfig.h
> @@ -17,11 +17,3 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdeps/generic/ldconfig.h>
> -
> -#define SYSDEP_KNOWN_INTERPRETER_NAMES \
> -  { "/lib/ld.so.1", FLAG_ELF_LIBC6 },  \
> -  { "/lib64/ld64.so.1", FLAG_ELF_LIBC6 }, \
> -  { "/lib64/ld64.so.2", FLAG_ELF_LIBC6 },
> -#define SYSDEP_KNOWN_LIBRARY_NAMES \
> -  { "libc.so.6", FLAG_ELF_LIBC6 },     \
> -  { "libm.so.6", FLAG_ELF_LIBC6 },
> diff --git a/sysdeps/unix/sysv/linux/riscv/ldconfig.h b/sysdeps/unix/sysv/linux/riscv/ldconfig.h
> index e6e7d271ad..24aae5155a 100644
> --- a/sysdeps/unix/sysv/linux/riscv/ldconfig.h
> +++ b/sysdeps/unix/sysv/linux/riscv/ldconfig.h
> @@ -17,20 +17,3 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdeps/generic/ldconfig.h>
> -
> -#define LD_SO_PREFIX "/lib/ld-linux-"
> -#define LD_SO_SUFFIX ".so.1"
> -
> -#if __riscv_xlen == 64
> -# define LD_SO_ABI "riscv64-lp64"
> -#else
> -# define LD_SO_ABI "riscv32-ilp32"
> -#endif
> -
> -#define SYSDEP_KNOWN_INTERPRETER_NAMES                         \
> -  { LD_SO_PREFIX LD_SO_ABI "d" LD_SO_SUFFIX, FLAG_ELF_LIBC6 }, \
> -  { LD_SO_PREFIX LD_SO_ABI     LD_SO_SUFFIX, FLAG_ELF_LIBC6 },
> -
> -#define SYSDEP_KNOWN_LIBRARY_NAMES     \
> -  { "libc.so.6", FLAG_ELF_LIBC6 },     \
> -  { "libm.so.6", FLAG_ELF_LIBC6 },
> diff --git a/sysdeps/unix/sysv/linux/s390/ldconfig.h b/sysdeps/unix/sysv/linux/s390/ldconfig.h
> index 83086ce843..b3fa8ceebe 100644
> --- a/sysdeps/unix/sysv/linux/s390/ldconfig.h
> +++ b/sysdeps/unix/sysv/linux/s390/ldconfig.h
> @@ -16,10 +16,3 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdeps/generic/ldconfig.h>
> -
> -#define SYSDEP_KNOWN_INTERPRETER_NAMES \
> -  { "/lib/ld.so.1", FLAG_ELF_LIBC6 },  \
> -  { "/lib/ld64.so.1", FLAG_ELF_LIBC6 },
> -#define SYSDEP_KNOWN_LIBRARY_NAMES \
> -  { "libc.so.6", FLAG_ELF_LIBC6 },     \
> -  { "libm.so.6", FLAG_ELF_LIBC6 },
> diff --git a/sysdeps/unix/sysv/linux/x86_64/ldconfig.h b/sysdeps/unix/sysv/linux/x86_64/ldconfig.h
> index 1089668f09..b3fa8ceebe 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/ldconfig.h
> +++ b/sysdeps/unix/sysv/linux/x86_64/ldconfig.h
> @@ -16,11 +16,3 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdeps/generic/ldconfig.h>
> -
> -#define SYSDEP_KNOWN_INTERPRETER_NAMES \
> -  { "/lib/ld-linux.so.2", FLAG_ELF_LIBC6 }, \
> -  { "/libx32/ld-linux-x32.so.2", FLAG_ELF_LIBC6 }, \
> -  { "/lib64/ld-linux-x86-64.so.2", FLAG_ELF_LIBC6 },
> -#define SYSDEP_KNOWN_LIBRARY_NAMES \
> -  { "libc.so.6", FLAG_ELF_LIBC6 },     \
> -  { "libm.so.6", FLAG_ELF_LIBC6 },
> -- 
> 2.31.1
>
  
Adhemerval Zanella Jan. 11, 2022, 7:22 p.m. UTC | #2
On 22/12/2021 12:31, Lucas A. M. Magalhaes via Libc-alpha wrote:
> I've tested it in a AT build and was able to build and link programs as
> expected. For other archs I try with build-many-glibcs.py, all
> succeeded.
> 
> Any other suggestions on how to test this?
> 
> Florian am I missing something? Should we add a restriction to cache
> just new libc6.so compatible libraries?
> 
> -- 8< --
> 
> The older libcs version are obsolete for over twenty years now. This
> commit removes special flags of libc.5.so and libc.4.so.. It assume that
> all libraries cached are libc.6.so compatible and wrote FLAG_ELF_LIBC6.
> 
> Tested on x86_64, powerpc, powerpc64 and powerpc64le.
> Tested with build-many-glibcs.py for the other affected architectures.

I think it makes sense to stop support libc.4 and libc.5 and assume
FLAG_ELF_LIBC6 by ldconfig.

I also think it should be safe to just get rid of the arch-specific
SYSDEP_KNOWN_INTERPRETER_NAMES, at least in theory it should not be
used by the cache (so there is not need to actually classify it).

> ---
>  elf/cache.c                                |  6 +--
>  elf/ldconfig.c                             | 33 +---------------
>  elf/readelflib.c                           | 46 +++-------------------
>  elf/readlib.c                              | 25 +-----------
>  sysdeps/unix/sysv/linux/arc/ldconfig.h     |  8 ----
>  sysdeps/unix/sysv/linux/arm/ldconfig.h     |  7 ----
>  sysdeps/unix/sysv/linux/csky/ldconfig.h    |  6 ---
>  sysdeps/unix/sysv/linux/ia64/ldconfig.h    |  6 ---
>  sysdeps/unix/sysv/linux/powerpc/ldconfig.h |  8 ----
>  sysdeps/unix/sysv/linux/riscv/ldconfig.h   | 17 --------
>  sysdeps/unix/sysv/linux/s390/ldconfig.h    |  7 ----
>  sysdeps/unix/sysv/linux/x86_64/ldconfig.h  |  8 ----
>  12 files changed, 11 insertions(+), 166 deletions(-)
> 
> diff --git a/elf/cache.c b/elf/cache.c
> index 1c0dc5ee87..387dd11a05 100644
> --- a/elf/cache.c
> +++ b/elf/cache.c
> @@ -158,6 +158,7 @@ struct cache_entry
>  /* List of all cache entries.  */
>  static struct cache_entry *entries;
>  
> +/* libc4, ELF and libc5 are unsupported */
>  static const char *flag_descr[] =
>  { "libc4", "ELF", "libc5", "libc6"};
>  
> @@ -169,14 +170,11 @@ print_entry (const char *lib, int flag, unsigned int osversion,
>    printf ("\t%s (", lib);
>    switch (flag & FLAG_TYPE_MASK)
>      {
> -    case FLAG_LIBC4:
> -    case FLAG_ELF:
> -    case FLAG_ELF_LIBC5:
>      case FLAG_ELF_LIBC6:
>        fputs (flag_descr[flag & FLAG_TYPE_MASK], stdout);
>        break;
>      default:
> -      fputs (_("unknown"), stdout);
> +      fputs (_("Unknown or unsupported flag"), stdout);
>        break;
>      }
>    switch (flag & FLAG_REQUIRED_MASK)
> diff --git a/elf/ldconfig.c b/elf/ldconfig.c
> index 101d56ac8e..d64b134781 100644
> --- a/elf/ldconfig.c
> +++ b/elf/ldconfig.c
> @@ -65,19 +65,6 @@
>  
>  #define PACKAGE _libc_intl_domainname
>  
> -static const struct
> -{
> -  const char *name;
> -  int flag;
> -} lib_types[] =
> -{
> -  {"libc4", FLAG_LIBC4},
> -  {"libc5", FLAG_ELF_LIBC5},
> -  {"libc6", FLAG_ELF_LIBC6},
> -  {"glibc2", FLAG_ELF_LIBC6}
> -};
> -
> -
>  /* List of directories to handle.  */
>  struct dir_entry
>  {
> @@ -471,25 +458,7 @@ add_dir_1 (const char *line, const char *from_file, int from_line)
>  
>    /* Search for an '=' sign.  */
>    entry->path = xstrdup (line);
> -  char *equal_sign = strchr (entry->path, '=');
> -  if (equal_sign)
> -    {
> -      *equal_sign = '\0';
> -      ++equal_sign;
> -      entry->flag = FLAG_ANY;
> -      for (i = 0; i < sizeof (lib_types) / sizeof (lib_types[0]); ++i)
> -	if (strcmp (equal_sign, lib_types[i].name) == 0)
> -	  {
> -	    entry->flag = lib_types[i].flag;
> -	    break;
> -	  }
> -      if (entry->flag == FLAG_ANY)
> -	error (0, 0, _("%s is not a known library type"), equal_sign);
> -    }
> -  else
> -    {
> -      entry->flag = FLAG_ANY;
> -    }
> +  entry->flag = FLAG_ELF_LIBC6;
>  
>    /* Canonify path: for now only remove leading and trailing
>       whitespace and the trailing slashes.  */
> diff --git a/elf/readelflib.c b/elf/readelflib.c
> index 10b10b6080..801c5587ab 100644
> --- a/elf/readelflib.c
> +++ b/elf/readelflib.c
> @@ -44,7 +44,6 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
>  		  char **soname, void *file_contents, size_t file_length)
>  {
>    int i;
> -  unsigned int j;
>    unsigned int dynamic_addr;
>    size_t dynamic_size;
>    char *program_interpreter;
> @@ -82,9 +81,8 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
>    elf_pheader = (ElfW(Phdr) *) (elf_header->e_phoff + file_contents);
>    check_ptr (elf_pheader);
>  
> -  /* The library is an elf library, now search for soname and
> -     libc5/libc6.  */
> -  *flag = FLAG_ELF;
> +  /* The library is an elf library   */
> +  *flag = FLAG_ELF_LIBC6;
>  
>    /* The default ISA level is 0.  */
>    *isa_level = 0;
> @@ -111,16 +109,6 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
>  	  program_interpreter = (char *) (file_contents + segment->p_offset);
>  	  check_ptr (program_interpreter);
>  
> -	  /* Check if this is enough to classify the binary.  */
> -	  for (j = 0; j < sizeof (interpreters) / sizeof (interpreters [0]);
> -	       ++j)
> -	    if (strcmp (program_interpreter, interpreters[j].soname) == 0)
> -	      {
> -		*flag = interpreters[j].flag;
> -		break;
> -	      }
> -	  break;
> -
>  	case PT_NOTE:
>  	  if (!*osversion && segment->p_filesz >= 32 && segment->p_align >= 4)
>  	    {
> @@ -291,38 +279,16 @@ done:
>    if (dynamic_strings == NULL)
>      return 1;
>  
> -  /* Now read the DT_NEEDED and DT_SONAME entries.  */
> +  /* Now read the DT_SONAME entries.  */
>    for (dyn_entry = dynamic_segment; dyn_entry->d_tag != DT_NULL;
>         ++dyn_entry)
>      {
> -      if (dyn_entry->d_tag == DT_NEEDED || dyn_entry->d_tag == DT_SONAME)
> +      if (dyn_entry->d_tag == DT_SONAME)
>  	{
>  	  char *name = dynamic_strings + dyn_entry->d_un.d_val;
>  	  check_ptr (name);
> -
> -	  if (dyn_entry->d_tag == DT_NEEDED)
> -	    {
> -
> -	      if (*flag == FLAG_ELF)
> -		{
> -		  /* Check if this is enough to classify the binary.  */
> -		  for (j = 0;
> -		       j < sizeof (known_libs) / sizeof (known_libs [0]);
> -		       ++j)
> -		    if (strcmp (name, known_libs [j].soname) == 0)
> -		      {
> -			*flag = known_libs [j].flag;
> -			break;
> -		      }
> -		}
> -	    }
> -
> -	  else if (dyn_entry->d_tag == DT_SONAME)
> -	    *soname = xstrdup (name);
> -
> -	  /* Do we have everything we need?  */
> -	  if (*soname && *flag != FLAG_ELF)
> -	    return 0;
> +          *soname = xstrdup (name);
> +          return 0;
>  	}
>      }
>  
> diff --git a/elf/readlib.c b/elf/readlib.c
> index 64b20d7804..9164c1cda7 100644
> --- a/elf/readlib.c
> +++ b/elf/readlib.c
> @@ -43,24 +43,6 @@ struct known_names
>    int flag;
>  };
>  
> -static struct known_names interpreters[] =
> -{
> -  { "/lib/" LD_SO, FLAG_ELF_LIBC6 },
> -#ifdef SYSDEP_KNOWN_INTERPRETER_NAMES
> -  SYSDEP_KNOWN_INTERPRETER_NAMES
> -#endif
> -};
> -
> -static struct known_names known_libs[] =
> -{
> -  { LIBC_SO, FLAG_ELF_LIBC6 },
> -  { LIBM_SO, FLAG_ELF_LIBC6 },
> -#ifdef SYSDEP_KNOWN_LIBRARY_NAMES
> -  SYSDEP_KNOWN_LIBRARY_NAMES
> -#endif
> -};
> -
> -
>  /* Check if string corresponds to a GDB Python file.  */
>  static bool
>  is_gdb_python_file (const char *name)
> @@ -84,7 +66,8 @@ process_file (const char *real_file_name, const char *file_name,
>    struct exec *aout_header;
>  
>    ret = 0;
> -  *flag = FLAG_ANY;
> +  /* Just set FLAG_ELF_LIBC6 as old formats are not supported anymore.  */
> +  *flag = FLAG_ELF_LIBC6;
>    *soname = NULL;
>  
>    file = fopen (real_file_name, "rb");
> @@ -151,7 +134,6 @@ process_file (const char *real_file_name, const char *file_name,
>  	    *dot = '\0';
>  	}
>        *soname = copy;
> -      *flag = FLAG_LIBC4;
>        goto done;
>      }
>  
> @@ -192,9 +174,6 @@ implicit_soname (const char *lib, int flag)
>  {
>    char *soname = xstrdup (lib);
>  
> -  if ((flag & FLAG_TYPE_MASK) != FLAG_LIBC4)
> -    return soname;
> -
>    /* Aout files don't have a soname, just return the name
>       including the major number.  */
>    char *major = strstr (soname, ".so.");
> diff --git a/sysdeps/unix/sysv/linux/arc/ldconfig.h b/sysdeps/unix/sysv/linux/arc/ldconfig.h
> index 8c776fca9e..02ed826283 100644
> --- a/sysdeps/unix/sysv/linux/arc/ldconfig.h
> +++ b/sysdeps/unix/sysv/linux/arc/ldconfig.h
> @@ -17,11 +17,3 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdeps/generic/ldconfig.h>
> -
> -#define SYSDEP_KNOWN_INTERPRETER_NAMES 		\
> -  { "/lib/ld-linux-arc.so.2", FLAG_ELF_LIBC6 },	\
> -  { "/lib/ld-linux-arceb.so.2", FLAG_ELF_LIBC6 },
> -
> -#define SYSDEP_KNOWN_LIBRARY_NAMES 	\
> -  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> -  { "libm.so.6", FLAG_ELF_LIBC6 },
> diff --git a/sysdeps/unix/sysv/linux/arm/ldconfig.h b/sysdeps/unix/sysv/linux/arm/ldconfig.h
> index d839470cfe..b3fa8ceebe 100644
> --- a/sysdeps/unix/sysv/linux/arm/ldconfig.h
> +++ b/sysdeps/unix/sysv/linux/arm/ldconfig.h
> @@ -16,10 +16,3 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdeps/generic/ldconfig.h>
> -
> -#define SYSDEP_KNOWN_INTERPRETER_NAMES \
> -  { "/lib/ld-linux.so.3", FLAG_ELF_LIBC6 }, \
> -  { "/lib/ld-linux-armhf.so.3", FLAG_ELF_LIBC6 },
> -#define SYSDEP_KNOWN_LIBRARY_NAMES \
> -  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> -  { "libm.so.6", FLAG_ELF_LIBC6 },
> diff --git a/sysdeps/unix/sysv/linux/csky/ldconfig.h b/sysdeps/unix/sysv/linux/csky/ldconfig.h
> index eeda37e4a8..6861f71327 100644
> --- a/sysdeps/unix/sysv/linux/csky/ldconfig.h
> +++ b/sysdeps/unix/sysv/linux/csky/ldconfig.h
> @@ -26,9 +26,3 @@
>  #else
>  # define LD_SO_ABI "cskyv2"
>  #endif
> -
> -#define SYSDEP_KNOWN_INTERPRETER_NAMES	\
> -  { LD_SO_PREFIX LD_SO_ABI LD_SO_SUFFIX, FLAG_ELF_LIBC6 },
> -#define SYSDEP_KNOWN_LIBRARY_NAMES	\
> -  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> -  { "libm.so.6", FLAG_ELF_LIBC6 },
> diff --git a/sysdeps/unix/sysv/linux/ia64/ldconfig.h b/sysdeps/unix/sysv/linux/ia64/ldconfig.h
> index 53685659ed..b3fa8ceebe 100644
> --- a/sysdeps/unix/sysv/linux/ia64/ldconfig.h
> +++ b/sysdeps/unix/sysv/linux/ia64/ldconfig.h
> @@ -16,9 +16,3 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdeps/generic/ldconfig.h>
> -
> -#define SYSDEP_KNOWN_INTERPRETER_NAMES \
> -  { "/lib/ld-linux.so.2", FLAG_ELF_LIBC6 },
> -#define SYSDEP_KNOWN_LIBRARY_NAMES \
> -  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> -  { "libm.so.6", FLAG_ELF_LIBC6 },
> diff --git a/sysdeps/unix/sysv/linux/powerpc/ldconfig.h b/sysdeps/unix/sysv/linux/powerpc/ldconfig.h
> index 09d75b3dec..d0935d541b 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/ldconfig.h
> +++ b/sysdeps/unix/sysv/linux/powerpc/ldconfig.h
> @@ -17,11 +17,3 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdeps/generic/ldconfig.h>
> -
> -#define SYSDEP_KNOWN_INTERPRETER_NAMES \
> -  { "/lib/ld.so.1", FLAG_ELF_LIBC6 },	\
> -  { "/lib64/ld64.so.1", FLAG_ELF_LIBC6 }, \
> -  { "/lib64/ld64.so.2", FLAG_ELF_LIBC6 },
> -#define SYSDEP_KNOWN_LIBRARY_NAMES \
> -  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> -  { "libm.so.6", FLAG_ELF_LIBC6 },
> diff --git a/sysdeps/unix/sysv/linux/riscv/ldconfig.h b/sysdeps/unix/sysv/linux/riscv/ldconfig.h
> index e6e7d271ad..24aae5155a 100644
> --- a/sysdeps/unix/sysv/linux/riscv/ldconfig.h
> +++ b/sysdeps/unix/sysv/linux/riscv/ldconfig.h
> @@ -17,20 +17,3 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdeps/generic/ldconfig.h>
> -
> -#define LD_SO_PREFIX "/lib/ld-linux-"
> -#define LD_SO_SUFFIX ".so.1"
> -
> -#if __riscv_xlen == 64
> -# define LD_SO_ABI "riscv64-lp64"
> -#else
> -# define LD_SO_ABI "riscv32-ilp32"
> -#endif
> -
> -#define SYSDEP_KNOWN_INTERPRETER_NAMES				\
> -  { LD_SO_PREFIX LD_SO_ABI "d" LD_SO_SUFFIX, FLAG_ELF_LIBC6 },	\
> -  { LD_SO_PREFIX LD_SO_ABI     LD_SO_SUFFIX, FLAG_ELF_LIBC6 },
> -
> -#define SYSDEP_KNOWN_LIBRARY_NAMES	\
> -  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> -  { "libm.so.6", FLAG_ELF_LIBC6 },
> diff --git a/sysdeps/unix/sysv/linux/s390/ldconfig.h b/sysdeps/unix/sysv/linux/s390/ldconfig.h
> index 83086ce843..b3fa8ceebe 100644
> --- a/sysdeps/unix/sysv/linux/s390/ldconfig.h
> +++ b/sysdeps/unix/sysv/linux/s390/ldconfig.h
> @@ -16,10 +16,3 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdeps/generic/ldconfig.h>
> -
> -#define SYSDEP_KNOWN_INTERPRETER_NAMES \
> -  { "/lib/ld.so.1", FLAG_ELF_LIBC6 },	\
> -  { "/lib/ld64.so.1", FLAG_ELF_LIBC6 },
> -#define SYSDEP_KNOWN_LIBRARY_NAMES \
> -  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> -  { "libm.so.6", FLAG_ELF_LIBC6 },
> diff --git a/sysdeps/unix/sysv/linux/x86_64/ldconfig.h b/sysdeps/unix/sysv/linux/x86_64/ldconfig.h
> index 1089668f09..b3fa8ceebe 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/ldconfig.h
> +++ b/sysdeps/unix/sysv/linux/x86_64/ldconfig.h
> @@ -16,11 +16,3 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdeps/generic/ldconfig.h>
> -
> -#define SYSDEP_KNOWN_INTERPRETER_NAMES \
> -  { "/lib/ld-linux.so.2", FLAG_ELF_LIBC6 }, \
> -  { "/libx32/ld-linux-x32.so.2", FLAG_ELF_LIBC6 }, \
> -  { "/lib64/ld-linux-x86-64.so.2", FLAG_ELF_LIBC6 },
> -#define SYSDEP_KNOWN_LIBRARY_NAMES \
> -  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> -  { "libm.so.6", FLAG_ELF_LIBC6 },
  
Raoni Fassina Firmino Feb. 23, 2022, 10:17 p.m. UTC | #3
While testing Lucas previous patch I decided to test this one too, so I
tested this on top of master without regression in the following
configurations:

powerpc-linux-gnu
powerpc64-linux-gnu  (with -m64 and with -m32)
powerpc64le-linux-gnu
ppc64le-redhat-linux
x86_64-linux-gnu  (with -m64 and with -m32 with all the other flags to build 32bits)


o/
Raoni

On Wed, Dec 22, 2021 at 12:31:51PM -0300, AL glibc-alpha wrote:
> I've tested it in a AT build and was able to build and link programs as
> expected. For other archs I try with build-many-glibcs.py, all
> succeeded.
> 
> Any other suggestions on how to test this?
> 
> Florian am I missing something? Should we add a restriction to cache
> just new libc6.so compatible libraries?
> 
> -- 8< --
> 
> The older libcs version are obsolete for over twenty years now. This
> commit removes special flags of libc.5.so and libc.4.so.. It assume that
> all libraries cached are libc.6.so compatible and wrote FLAG_ELF_LIBC6.
> 
> Tested on x86_64, powerpc, powerpc64 and powerpc64le.
> Tested with build-many-glibcs.py for the other affected architectures.
> ---
>  elf/cache.c                                |  6 +--
>  elf/ldconfig.c                             | 33 +---------------
>  elf/readelflib.c                           | 46 +++-------------------
>  elf/readlib.c                              | 25 +-----------
>  sysdeps/unix/sysv/linux/arc/ldconfig.h     |  8 ----
>  sysdeps/unix/sysv/linux/arm/ldconfig.h     |  7 ----
>  sysdeps/unix/sysv/linux/csky/ldconfig.h    |  6 ---
>  sysdeps/unix/sysv/linux/ia64/ldconfig.h    |  6 ---
>  sysdeps/unix/sysv/linux/powerpc/ldconfig.h |  8 ----
>  sysdeps/unix/sysv/linux/riscv/ldconfig.h   | 17 --------
>  sysdeps/unix/sysv/linux/s390/ldconfig.h    |  7 ----
>  sysdeps/unix/sysv/linux/x86_64/ldconfig.h  |  8 ----
>  12 files changed, 11 insertions(+), 166 deletions(-)
> 
> diff --git a/elf/cache.c b/elf/cache.c
> index 1c0dc5ee87..387dd11a05 100644
> --- a/elf/cache.c
> +++ b/elf/cache.c
> @@ -158,6 +158,7 @@ struct cache_entry
>  /* List of all cache entries.  */
>  static struct cache_entry *entries;
>  
> +/* libc4, ELF and libc5 are unsupported */
>  static const char *flag_descr[] =
>  { "libc4", "ELF", "libc5", "libc6"};
>  
> @@ -169,14 +170,11 @@ print_entry (const char *lib, int flag, unsigned int osversion,
>    printf ("\t%s (", lib);
>    switch (flag & FLAG_TYPE_MASK)
>      {
> -    case FLAG_LIBC4:
> -    case FLAG_ELF:
> -    case FLAG_ELF_LIBC5:
>      case FLAG_ELF_LIBC6:
>        fputs (flag_descr[flag & FLAG_TYPE_MASK], stdout);
>        break;
>      default:
> -      fputs (_("unknown"), stdout);
> +      fputs (_("Unknown or unsupported flag"), stdout);
>        break;
>      }
>    switch (flag & FLAG_REQUIRED_MASK)
> diff --git a/elf/ldconfig.c b/elf/ldconfig.c
> index 101d56ac8e..d64b134781 100644
> --- a/elf/ldconfig.c
> +++ b/elf/ldconfig.c
> @@ -65,19 +65,6 @@
>  
>  #define PACKAGE _libc_intl_domainname
>  
> -static const struct
> -{
> -  const char *name;
> -  int flag;
> -} lib_types[] =
> -{
> -  {"libc4", FLAG_LIBC4},
> -  {"libc5", FLAG_ELF_LIBC5},
> -  {"libc6", FLAG_ELF_LIBC6},
> -  {"glibc2", FLAG_ELF_LIBC6}
> -};
> -
> -
>  /* List of directories to handle.  */
>  struct dir_entry
>  {
> @@ -471,25 +458,7 @@ add_dir_1 (const char *line, const char *from_file, int from_line)
>  
>    /* Search for an '=' sign.  */
>    entry->path = xstrdup (line);
> -  char *equal_sign = strchr (entry->path, '=');
> -  if (equal_sign)
> -    {
> -      *equal_sign = '\0';
> -      ++equal_sign;
> -      entry->flag = FLAG_ANY;
> -      for (i = 0; i < sizeof (lib_types) / sizeof (lib_types[0]); ++i)
> -	if (strcmp (equal_sign, lib_types[i].name) == 0)
> -	  {
> -	    entry->flag = lib_types[i].flag;
> -	    break;
> -	  }
> -      if (entry->flag == FLAG_ANY)
> -	error (0, 0, _("%s is not a known library type"), equal_sign);
> -    }
> -  else
> -    {
> -      entry->flag = FLAG_ANY;
> -    }
> +  entry->flag = FLAG_ELF_LIBC6;
>  
>    /* Canonify path: for now only remove leading and trailing
>       whitespace and the trailing slashes.  */
> diff --git a/elf/readelflib.c b/elf/readelflib.c
> index 10b10b6080..801c5587ab 100644
> --- a/elf/readelflib.c
> +++ b/elf/readelflib.c
> @@ -44,7 +44,6 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
>  		  char **soname, void *file_contents, size_t file_length)
>  {
>    int i;
> -  unsigned int j;
>    unsigned int dynamic_addr;
>    size_t dynamic_size;
>    char *program_interpreter;
> @@ -82,9 +81,8 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
>    elf_pheader = (ElfW(Phdr) *) (elf_header->e_phoff + file_contents);
>    check_ptr (elf_pheader);
>  
> -  /* The library is an elf library, now search for soname and
> -     libc5/libc6.  */
> -  *flag = FLAG_ELF;
> +  /* The library is an elf library   */
> +  *flag = FLAG_ELF_LIBC6;
>  
>    /* The default ISA level is 0.  */
>    *isa_level = 0;
> @@ -111,16 +109,6 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
>  	  program_interpreter = (char *) (file_contents + segment->p_offset);
>  	  check_ptr (program_interpreter);
>  
> -	  /* Check if this is enough to classify the binary.  */
> -	  for (j = 0; j < sizeof (interpreters) / sizeof (interpreters [0]);
> -	       ++j)
> -	    if (strcmp (program_interpreter, interpreters[j].soname) == 0)
> -	      {
> -		*flag = interpreters[j].flag;
> -		break;
> -	      }
> -	  break;
> -
>  	case PT_NOTE:
>  	  if (!*osversion && segment->p_filesz >= 32 && segment->p_align >= 4)
>  	    {
> @@ -291,38 +279,16 @@ done:
>    if (dynamic_strings == NULL)
>      return 1;
>  
> -  /* Now read the DT_NEEDED and DT_SONAME entries.  */
> +  /* Now read the DT_SONAME entries.  */
>    for (dyn_entry = dynamic_segment; dyn_entry->d_tag != DT_NULL;
>         ++dyn_entry)
>      {
> -      if (dyn_entry->d_tag == DT_NEEDED || dyn_entry->d_tag == DT_SONAME)
> +      if (dyn_entry->d_tag == DT_SONAME)
>  	{
>  	  char *name = dynamic_strings + dyn_entry->d_un.d_val;
>  	  check_ptr (name);
> -
> -	  if (dyn_entry->d_tag == DT_NEEDED)
> -	    {
> -
> -	      if (*flag == FLAG_ELF)
> -		{
> -		  /* Check if this is enough to classify the binary.  */
> -		  for (j = 0;
> -		       j < sizeof (known_libs) / sizeof (known_libs [0]);
> -		       ++j)
> -		    if (strcmp (name, known_libs [j].soname) == 0)
> -		      {
> -			*flag = known_libs [j].flag;
> -			break;
> -		      }
> -		}
> -	    }
> -
> -	  else if (dyn_entry->d_tag == DT_SONAME)
> -	    *soname = xstrdup (name);
> -
> -	  /* Do we have everything we need?  */
> -	  if (*soname && *flag != FLAG_ELF)
> -	    return 0;
> +          *soname = xstrdup (name);
> +          return 0;
>  	}
>      }
>  
> diff --git a/elf/readlib.c b/elf/readlib.c
> index 64b20d7804..9164c1cda7 100644
> --- a/elf/readlib.c
> +++ b/elf/readlib.c
> @@ -43,24 +43,6 @@ struct known_names
>    int flag;
>  };
>  
> -static struct known_names interpreters[] =
> -{
> -  { "/lib/" LD_SO, FLAG_ELF_LIBC6 },
> -#ifdef SYSDEP_KNOWN_INTERPRETER_NAMES
> -  SYSDEP_KNOWN_INTERPRETER_NAMES
> -#endif
> -};
> -
> -static struct known_names known_libs[] =
> -{
> -  { LIBC_SO, FLAG_ELF_LIBC6 },
> -  { LIBM_SO, FLAG_ELF_LIBC6 },
> -#ifdef SYSDEP_KNOWN_LIBRARY_NAMES
> -  SYSDEP_KNOWN_LIBRARY_NAMES
> -#endif
> -};
> -
> -
>  /* Check if string corresponds to a GDB Python file.  */
>  static bool
>  is_gdb_python_file (const char *name)
> @@ -84,7 +66,8 @@ process_file (const char *real_file_name, const char *file_name,
>    struct exec *aout_header;
>  
>    ret = 0;
> -  *flag = FLAG_ANY;
> +  /* Just set FLAG_ELF_LIBC6 as old formats are not supported anymore.  */
> +  *flag = FLAG_ELF_LIBC6;
>    *soname = NULL;
>  
>    file = fopen (real_file_name, "rb");
> @@ -151,7 +134,6 @@ process_file (const char *real_file_name, const char *file_name,
>  	    *dot = '\0';
>  	}
>        *soname = copy;
> -      *flag = FLAG_LIBC4;
>        goto done;
>      }
>  
> @@ -192,9 +174,6 @@ implicit_soname (const char *lib, int flag)
>  {
>    char *soname = xstrdup (lib);
>  
> -  if ((flag & FLAG_TYPE_MASK) != FLAG_LIBC4)
> -    return soname;
> -
>    /* Aout files don't have a soname, just return the name
>       including the major number.  */
>    char *major = strstr (soname, ".so.");
> diff --git a/sysdeps/unix/sysv/linux/arc/ldconfig.h b/sysdeps/unix/sysv/linux/arc/ldconfig.h
> index 8c776fca9e..02ed826283 100644
> --- a/sysdeps/unix/sysv/linux/arc/ldconfig.h
> +++ b/sysdeps/unix/sysv/linux/arc/ldconfig.h
> @@ -17,11 +17,3 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdeps/generic/ldconfig.h>
> -
> -#define SYSDEP_KNOWN_INTERPRETER_NAMES 		\
> -  { "/lib/ld-linux-arc.so.2", FLAG_ELF_LIBC6 },	\
> -  { "/lib/ld-linux-arceb.so.2", FLAG_ELF_LIBC6 },
> -
> -#define SYSDEP_KNOWN_LIBRARY_NAMES 	\
> -  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> -  { "libm.so.6", FLAG_ELF_LIBC6 },
> diff --git a/sysdeps/unix/sysv/linux/arm/ldconfig.h b/sysdeps/unix/sysv/linux/arm/ldconfig.h
> index d839470cfe..b3fa8ceebe 100644
> --- a/sysdeps/unix/sysv/linux/arm/ldconfig.h
> +++ b/sysdeps/unix/sysv/linux/arm/ldconfig.h
> @@ -16,10 +16,3 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdeps/generic/ldconfig.h>
> -
> -#define SYSDEP_KNOWN_INTERPRETER_NAMES \
> -  { "/lib/ld-linux.so.3", FLAG_ELF_LIBC6 }, \
> -  { "/lib/ld-linux-armhf.so.3", FLAG_ELF_LIBC6 },
> -#define SYSDEP_KNOWN_LIBRARY_NAMES \
> -  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> -  { "libm.so.6", FLAG_ELF_LIBC6 },
> diff --git a/sysdeps/unix/sysv/linux/csky/ldconfig.h b/sysdeps/unix/sysv/linux/csky/ldconfig.h
> index eeda37e4a8..6861f71327 100644
> --- a/sysdeps/unix/sysv/linux/csky/ldconfig.h
> +++ b/sysdeps/unix/sysv/linux/csky/ldconfig.h
> @@ -26,9 +26,3 @@
>  #else
>  # define LD_SO_ABI "cskyv2"
>  #endif
> -
> -#define SYSDEP_KNOWN_INTERPRETER_NAMES	\
> -  { LD_SO_PREFIX LD_SO_ABI LD_SO_SUFFIX, FLAG_ELF_LIBC6 },
> -#define SYSDEP_KNOWN_LIBRARY_NAMES	\
> -  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> -  { "libm.so.6", FLAG_ELF_LIBC6 },
> diff --git a/sysdeps/unix/sysv/linux/ia64/ldconfig.h b/sysdeps/unix/sysv/linux/ia64/ldconfig.h
> index 53685659ed..b3fa8ceebe 100644
> --- a/sysdeps/unix/sysv/linux/ia64/ldconfig.h
> +++ b/sysdeps/unix/sysv/linux/ia64/ldconfig.h
> @@ -16,9 +16,3 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdeps/generic/ldconfig.h>
> -
> -#define SYSDEP_KNOWN_INTERPRETER_NAMES \
> -  { "/lib/ld-linux.so.2", FLAG_ELF_LIBC6 },
> -#define SYSDEP_KNOWN_LIBRARY_NAMES \
> -  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> -  { "libm.so.6", FLAG_ELF_LIBC6 },
> diff --git a/sysdeps/unix/sysv/linux/powerpc/ldconfig.h b/sysdeps/unix/sysv/linux/powerpc/ldconfig.h
> index 09d75b3dec..d0935d541b 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/ldconfig.h
> +++ b/sysdeps/unix/sysv/linux/powerpc/ldconfig.h
> @@ -17,11 +17,3 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdeps/generic/ldconfig.h>
> -
> -#define SYSDEP_KNOWN_INTERPRETER_NAMES \
> -  { "/lib/ld.so.1", FLAG_ELF_LIBC6 },	\
> -  { "/lib64/ld64.so.1", FLAG_ELF_LIBC6 }, \
> -  { "/lib64/ld64.so.2", FLAG_ELF_LIBC6 },
> -#define SYSDEP_KNOWN_LIBRARY_NAMES \
> -  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> -  { "libm.so.6", FLAG_ELF_LIBC6 },
> diff --git a/sysdeps/unix/sysv/linux/riscv/ldconfig.h b/sysdeps/unix/sysv/linux/riscv/ldconfig.h
> index e6e7d271ad..24aae5155a 100644
> --- a/sysdeps/unix/sysv/linux/riscv/ldconfig.h
> +++ b/sysdeps/unix/sysv/linux/riscv/ldconfig.h
> @@ -17,20 +17,3 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdeps/generic/ldconfig.h>
> -
> -#define LD_SO_PREFIX "/lib/ld-linux-"
> -#define LD_SO_SUFFIX ".so.1"
> -
> -#if __riscv_xlen == 64
> -# define LD_SO_ABI "riscv64-lp64"
> -#else
> -# define LD_SO_ABI "riscv32-ilp32"
> -#endif
> -
> -#define SYSDEP_KNOWN_INTERPRETER_NAMES				\
> -  { LD_SO_PREFIX LD_SO_ABI "d" LD_SO_SUFFIX, FLAG_ELF_LIBC6 },	\
> -  { LD_SO_PREFIX LD_SO_ABI     LD_SO_SUFFIX, FLAG_ELF_LIBC6 },
> -
> -#define SYSDEP_KNOWN_LIBRARY_NAMES	\
> -  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> -  { "libm.so.6", FLAG_ELF_LIBC6 },
> diff --git a/sysdeps/unix/sysv/linux/s390/ldconfig.h b/sysdeps/unix/sysv/linux/s390/ldconfig.h
> index 83086ce843..b3fa8ceebe 100644
> --- a/sysdeps/unix/sysv/linux/s390/ldconfig.h
> +++ b/sysdeps/unix/sysv/linux/s390/ldconfig.h
> @@ -16,10 +16,3 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdeps/generic/ldconfig.h>
> -
> -#define SYSDEP_KNOWN_INTERPRETER_NAMES \
> -  { "/lib/ld.so.1", FLAG_ELF_LIBC6 },	\
> -  { "/lib/ld64.so.1", FLAG_ELF_LIBC6 },
> -#define SYSDEP_KNOWN_LIBRARY_NAMES \
> -  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> -  { "libm.so.6", FLAG_ELF_LIBC6 },
> diff --git a/sysdeps/unix/sysv/linux/x86_64/ldconfig.h b/sysdeps/unix/sysv/linux/x86_64/ldconfig.h
> index 1089668f09..b3fa8ceebe 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/ldconfig.h
> +++ b/sysdeps/unix/sysv/linux/x86_64/ldconfig.h
> @@ -16,11 +16,3 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sysdeps/generic/ldconfig.h>
> -
> -#define SYSDEP_KNOWN_INTERPRETER_NAMES \
> -  { "/lib/ld-linux.so.2", FLAG_ELF_LIBC6 }, \
> -  { "/libx32/ld-linux-x32.so.2", FLAG_ELF_LIBC6 }, \
> -  { "/lib64/ld-linux-x86-64.so.2", FLAG_ELF_LIBC6 },
> -#define SYSDEP_KNOWN_LIBRARY_NAMES \
> -  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> -  { "libm.so.6", FLAG_ELF_LIBC6 },
> -- 
> 2.31.1
>
  
Raoni Fassina Firmino March 2, 2022, 7:37 p.m. UTC | #4
On Tue, Jan 11, 2022 at 04:22:43PM -0300, AL glibc-alpha wrote:
> 
> 
> On 22/12/2021 12:31, Lucas A. M. Magalhaes via Libc-alpha wrote:
> > I've tested it in a AT build and was able to build and link programs as
> > expected. For other archs I try with build-many-glibcs.py, all
> > succeeded.
> > 
> > Any other suggestions on how to test this?
> > 
> > Florian am I missing something? Should we add a restriction to cache
> > just new libc6.so compatible libraries?
> > 
> > -- 8< --
> > 
> > The older libcs version are obsolete for over twenty years now. This
> > commit removes special flags of libc.5.so and libc.4.so.. It assume that
> > all libraries cached are libc.6.so compatible and wrote FLAG_ELF_LIBC6.
> > 
> > Tested on x86_64, powerpc, powerpc64 and powerpc64le.
> > Tested with build-many-glibcs.py for the other affected architectures.
> 
> I think it makes sense to stop support libc.4 and libc.5 and assume
> FLAG_ELF_LIBC6 by ldconfig.
> 
> I also think it should be safe to just get rid of the arch-specific
> SYSDEP_KNOWN_INTERPRETER_NAMES, at least in theory it should not be
> used by the cache (so there is not need to actually classify it).

Lucas's RFC already removed it for a bunch of architectures, only
leaving i386, aarch64 and mips64, and If my grep did not failed me It
seems like the only uses of YSDEP_KNOWN_LIBRARY_NAMES and
SYSDEP_KNOWN_INTERPRETER_NAMES were in known_libs and interpreters
respectively, both removed in the RFC, so it seems that definitions can
be safely removed (in the context of the RFC).

Not sure if there is a need for more opinions or consensus about this
RFC's idea and approach to move forward with a proper patch for review.


o/
Raoni

> 
> > ---
> >  elf/cache.c                                |  6 +--
> >  elf/ldconfig.c                             | 33 +---------------
> >  elf/readelflib.c                           | 46 +++-------------------
> >  elf/readlib.c                              | 25 +-----------
> >  sysdeps/unix/sysv/linux/arc/ldconfig.h     |  8 ----
> >  sysdeps/unix/sysv/linux/arm/ldconfig.h     |  7 ----
> >  sysdeps/unix/sysv/linux/csky/ldconfig.h    |  6 ---
> >  sysdeps/unix/sysv/linux/ia64/ldconfig.h    |  6 ---
> >  sysdeps/unix/sysv/linux/powerpc/ldconfig.h |  8 ----
> >  sysdeps/unix/sysv/linux/riscv/ldconfig.h   | 17 --------
> >  sysdeps/unix/sysv/linux/s390/ldconfig.h    |  7 ----
> >  sysdeps/unix/sysv/linux/x86_64/ldconfig.h  |  8 ----
> >  12 files changed, 11 insertions(+), 166 deletions(-)
> > 
> > diff --git a/elf/cache.c b/elf/cache.c
> > index 1c0dc5ee87..387dd11a05 100644
> > --- a/elf/cache.c
> > +++ b/elf/cache.c
> > @@ -158,6 +158,7 @@ struct cache_entry
> >  /* List of all cache entries.  */
> >  static struct cache_entry *entries;
> >  
> > +/* libc4, ELF and libc5 are unsupported */
> >  static const char *flag_descr[] =
> >  { "libc4", "ELF", "libc5", "libc6"};
> >  
> > @@ -169,14 +170,11 @@ print_entry (const char *lib, int flag, unsigned int osversion,
> >    printf ("\t%s (", lib);
> >    switch (flag & FLAG_TYPE_MASK)
> >      {
> > -    case FLAG_LIBC4:
> > -    case FLAG_ELF:
> > -    case FLAG_ELF_LIBC5:
> >      case FLAG_ELF_LIBC6:
> >        fputs (flag_descr[flag & FLAG_TYPE_MASK], stdout);
> >        break;
> >      default:
> > -      fputs (_("unknown"), stdout);
> > +      fputs (_("Unknown or unsupported flag"), stdout);
> >        break;
> >      }
> >    switch (flag & FLAG_REQUIRED_MASK)
> > diff --git a/elf/ldconfig.c b/elf/ldconfig.c
> > index 101d56ac8e..d64b134781 100644
> > --- a/elf/ldconfig.c
> > +++ b/elf/ldconfig.c
> > @@ -65,19 +65,6 @@
> >  
> >  #define PACKAGE _libc_intl_domainname
> >  
> > -static const struct
> > -{
> > -  const char *name;
> > -  int flag;
> > -} lib_types[] =
> > -{
> > -  {"libc4", FLAG_LIBC4},
> > -  {"libc5", FLAG_ELF_LIBC5},
> > -  {"libc6", FLAG_ELF_LIBC6},
> > -  {"glibc2", FLAG_ELF_LIBC6}
> > -};
> > -
> > -
> >  /* List of directories to handle.  */
> >  struct dir_entry
> >  {
> > @@ -471,25 +458,7 @@ add_dir_1 (const char *line, const char *from_file, int from_line)
> >  
> >    /* Search for an '=' sign.  */
> >    entry->path = xstrdup (line);
> > -  char *equal_sign = strchr (entry->path, '=');
> > -  if (equal_sign)
> > -    {
> > -      *equal_sign = '\0';
> > -      ++equal_sign;
> > -      entry->flag = FLAG_ANY;
> > -      for (i = 0; i < sizeof (lib_types) / sizeof (lib_types[0]); ++i)
> > -	if (strcmp (equal_sign, lib_types[i].name) == 0)
> > -	  {
> > -	    entry->flag = lib_types[i].flag;
> > -	    break;
> > -	  }
> > -      if (entry->flag == FLAG_ANY)
> > -	error (0, 0, _("%s is not a known library type"), equal_sign);
> > -    }
> > -  else
> > -    {
> > -      entry->flag = FLAG_ANY;
> > -    }
> > +  entry->flag = FLAG_ELF_LIBC6;
> >  
> >    /* Canonify path: for now only remove leading and trailing
> >       whitespace and the trailing slashes.  */
> > diff --git a/elf/readelflib.c b/elf/readelflib.c
> > index 10b10b6080..801c5587ab 100644
> > --- a/elf/readelflib.c
> > +++ b/elf/readelflib.c
> > @@ -44,7 +44,6 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
> >  		  char **soname, void *file_contents, size_t file_length)
> >  {
> >    int i;
> > -  unsigned int j;
> >    unsigned int dynamic_addr;
> >    size_t dynamic_size;
> >    char *program_interpreter;
> > @@ -82,9 +81,8 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
> >    elf_pheader = (ElfW(Phdr) *) (elf_header->e_phoff + file_contents);
> >    check_ptr (elf_pheader);
> >  
> > -  /* The library is an elf library, now search for soname and
> > -     libc5/libc6.  */
> > -  *flag = FLAG_ELF;
> > +  /* The library is an elf library   */
> > +  *flag = FLAG_ELF_LIBC6;
> >  
> >    /* The default ISA level is 0.  */
> >    *isa_level = 0;
> > @@ -111,16 +109,6 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
> >  	  program_interpreter = (char *) (file_contents + segment->p_offset);
> >  	  check_ptr (program_interpreter);
> >  
> > -	  /* Check if this is enough to classify the binary.  */
> > -	  for (j = 0; j < sizeof (interpreters) / sizeof (interpreters [0]);
> > -	       ++j)
> > -	    if (strcmp (program_interpreter, interpreters[j].soname) == 0)
> > -	      {
> > -		*flag = interpreters[j].flag;
> > -		break;
> > -	      }
> > -	  break;
> > -
> >  	case PT_NOTE:
> >  	  if (!*osversion && segment->p_filesz >= 32 && segment->p_align >= 4)
> >  	    {
> > @@ -291,38 +279,16 @@ done:
> >    if (dynamic_strings == NULL)
> >      return 1;
> >  
> > -  /* Now read the DT_NEEDED and DT_SONAME entries.  */
> > +  /* Now read the DT_SONAME entries.  */
> >    for (dyn_entry = dynamic_segment; dyn_entry->d_tag != DT_NULL;
> >         ++dyn_entry)
> >      {
> > -      if (dyn_entry->d_tag == DT_NEEDED || dyn_entry->d_tag == DT_SONAME)
> > +      if (dyn_entry->d_tag == DT_SONAME)
> >  	{
> >  	  char *name = dynamic_strings + dyn_entry->d_un.d_val;
> >  	  check_ptr (name);
> > -
> > -	  if (dyn_entry->d_tag == DT_NEEDED)
> > -	    {
> > -
> > -	      if (*flag == FLAG_ELF)
> > -		{
> > -		  /* Check if this is enough to classify the binary.  */
> > -		  for (j = 0;
> > -		       j < sizeof (known_libs) / sizeof (known_libs [0]);
> > -		       ++j)
> > -		    if (strcmp (name, known_libs [j].soname) == 0)
> > -		      {
> > -			*flag = known_libs [j].flag;
> > -			break;
> > -		      }
> > -		}
> > -	    }
> > -
> > -	  else if (dyn_entry->d_tag == DT_SONAME)
> > -	    *soname = xstrdup (name);
> > -
> > -	  /* Do we have everything we need?  */
> > -	  if (*soname && *flag != FLAG_ELF)
> > -	    return 0;
> > +          *soname = xstrdup (name);
> > +          return 0;
> >  	}
> >      }
> >  
> > diff --git a/elf/readlib.c b/elf/readlib.c
> > index 64b20d7804..9164c1cda7 100644
> > --- a/elf/readlib.c
> > +++ b/elf/readlib.c
> > @@ -43,24 +43,6 @@ struct known_names
> >    int flag;
> >  };
> >  
> > -static struct known_names interpreters[] =
> > -{
> > -  { "/lib/" LD_SO, FLAG_ELF_LIBC6 },
> > -#ifdef SYSDEP_KNOWN_INTERPRETER_NAMES
> > -  SYSDEP_KNOWN_INTERPRETER_NAMES
> > -#endif
> > -};
> > -
> > -static struct known_names known_libs[] =
> > -{
> > -  { LIBC_SO, FLAG_ELF_LIBC6 },
> > -  { LIBM_SO, FLAG_ELF_LIBC6 },
> > -#ifdef SYSDEP_KNOWN_LIBRARY_NAMES
> > -  SYSDEP_KNOWN_LIBRARY_NAMES
> > -#endif
> > -};
> > -
> > -
> >  /* Check if string corresponds to a GDB Python file.  */
> >  static bool
> >  is_gdb_python_file (const char *name)
> > @@ -84,7 +66,8 @@ process_file (const char *real_file_name, const char *file_name,
> >    struct exec *aout_header;
> >  
> >    ret = 0;
> > -  *flag = FLAG_ANY;
> > +  /* Just set FLAG_ELF_LIBC6 as old formats are not supported anymore.  */
> > +  *flag = FLAG_ELF_LIBC6;
> >    *soname = NULL;
> >  
> >    file = fopen (real_file_name, "rb");
> > @@ -151,7 +134,6 @@ process_file (const char *real_file_name, const char *file_name,
> >  	    *dot = '\0';
> >  	}
> >        *soname = copy;
> > -      *flag = FLAG_LIBC4;
> >        goto done;
> >      }
> >  
> > @@ -192,9 +174,6 @@ implicit_soname (const char *lib, int flag)
> >  {
> >    char *soname = xstrdup (lib);
> >  
> > -  if ((flag & FLAG_TYPE_MASK) != FLAG_LIBC4)
> > -    return soname;
> > -
> >    /* Aout files don't have a soname, just return the name
> >       including the major number.  */
> >    char *major = strstr (soname, ".so.");
> > diff --git a/sysdeps/unix/sysv/linux/arc/ldconfig.h b/sysdeps/unix/sysv/linux/arc/ldconfig.h
> > index 8c776fca9e..02ed826283 100644
> > --- a/sysdeps/unix/sysv/linux/arc/ldconfig.h
> > +++ b/sysdeps/unix/sysv/linux/arc/ldconfig.h
> > @@ -17,11 +17,3 @@
> >     <https://www.gnu.org/licenses/>.  */
> >  
> >  #include <sysdeps/generic/ldconfig.h>
> > -
> > -#define SYSDEP_KNOWN_INTERPRETER_NAMES 		\
> > -  { "/lib/ld-linux-arc.so.2", FLAG_ELF_LIBC6 },	\
> > -  { "/lib/ld-linux-arceb.so.2", FLAG_ELF_LIBC6 },
> > -
> > -#define SYSDEP_KNOWN_LIBRARY_NAMES 	\
> > -  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> > -  { "libm.so.6", FLAG_ELF_LIBC6 },
> > diff --git a/sysdeps/unix/sysv/linux/arm/ldconfig.h b/sysdeps/unix/sysv/linux/arm/ldconfig.h
> > index d839470cfe..b3fa8ceebe 100644
> > --- a/sysdeps/unix/sysv/linux/arm/ldconfig.h
> > +++ b/sysdeps/unix/sysv/linux/arm/ldconfig.h
> > @@ -16,10 +16,3 @@
> >     <https://www.gnu.org/licenses/>.  */
> >  
> >  #include <sysdeps/generic/ldconfig.h>
> > -
> > -#define SYSDEP_KNOWN_INTERPRETER_NAMES \
> > -  { "/lib/ld-linux.so.3", FLAG_ELF_LIBC6 }, \
> > -  { "/lib/ld-linux-armhf.so.3", FLAG_ELF_LIBC6 },
> > -#define SYSDEP_KNOWN_LIBRARY_NAMES \
> > -  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> > -  { "libm.so.6", FLAG_ELF_LIBC6 },
> > diff --git a/sysdeps/unix/sysv/linux/csky/ldconfig.h b/sysdeps/unix/sysv/linux/csky/ldconfig.h
> > index eeda37e4a8..6861f71327 100644
> > --- a/sysdeps/unix/sysv/linux/csky/ldconfig.h
> > +++ b/sysdeps/unix/sysv/linux/csky/ldconfig.h
> > @@ -26,9 +26,3 @@
> >  #else
> >  # define LD_SO_ABI "cskyv2"
> >  #endif
> > -
> > -#define SYSDEP_KNOWN_INTERPRETER_NAMES	\
> > -  { LD_SO_PREFIX LD_SO_ABI LD_SO_SUFFIX, FLAG_ELF_LIBC6 },
> > -#define SYSDEP_KNOWN_LIBRARY_NAMES	\
> > -  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> > -  { "libm.so.6", FLAG_ELF_LIBC6 },
> > diff --git a/sysdeps/unix/sysv/linux/ia64/ldconfig.h b/sysdeps/unix/sysv/linux/ia64/ldconfig.h
> > index 53685659ed..b3fa8ceebe 100644
> > --- a/sysdeps/unix/sysv/linux/ia64/ldconfig.h
> > +++ b/sysdeps/unix/sysv/linux/ia64/ldconfig.h
> > @@ -16,9 +16,3 @@
> >     <https://www.gnu.org/licenses/>.  */
> >  
> >  #include <sysdeps/generic/ldconfig.h>
> > -
> > -#define SYSDEP_KNOWN_INTERPRETER_NAMES \
> > -  { "/lib/ld-linux.so.2", FLAG_ELF_LIBC6 },
> > -#define SYSDEP_KNOWN_LIBRARY_NAMES \
> > -  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> > -  { "libm.so.6", FLAG_ELF_LIBC6 },
> > diff --git a/sysdeps/unix/sysv/linux/powerpc/ldconfig.h b/sysdeps/unix/sysv/linux/powerpc/ldconfig.h
> > index 09d75b3dec..d0935d541b 100644
> > --- a/sysdeps/unix/sysv/linux/powerpc/ldconfig.h
> > +++ b/sysdeps/unix/sysv/linux/powerpc/ldconfig.h
> > @@ -17,11 +17,3 @@
> >     <https://www.gnu.org/licenses/>.  */
> >  
> >  #include <sysdeps/generic/ldconfig.h>
> > -
> > -#define SYSDEP_KNOWN_INTERPRETER_NAMES \
> > -  { "/lib/ld.so.1", FLAG_ELF_LIBC6 },	\
> > -  { "/lib64/ld64.so.1", FLAG_ELF_LIBC6 }, \
> > -  { "/lib64/ld64.so.2", FLAG_ELF_LIBC6 },
> > -#define SYSDEP_KNOWN_LIBRARY_NAMES \
> > -  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> > -  { "libm.so.6", FLAG_ELF_LIBC6 },
> > diff --git a/sysdeps/unix/sysv/linux/riscv/ldconfig.h b/sysdeps/unix/sysv/linux/riscv/ldconfig.h
> > index e6e7d271ad..24aae5155a 100644
> > --- a/sysdeps/unix/sysv/linux/riscv/ldconfig.h
> > +++ b/sysdeps/unix/sysv/linux/riscv/ldconfig.h
> > @@ -17,20 +17,3 @@
> >     <https://www.gnu.org/licenses/>.  */
> >  
> >  #include <sysdeps/generic/ldconfig.h>
> > -
> > -#define LD_SO_PREFIX "/lib/ld-linux-"
> > -#define LD_SO_SUFFIX ".so.1"
> > -
> > -#if __riscv_xlen == 64
> > -# define LD_SO_ABI "riscv64-lp64"
> > -#else
> > -# define LD_SO_ABI "riscv32-ilp32"
> > -#endif
> > -
> > -#define SYSDEP_KNOWN_INTERPRETER_NAMES				\
> > -  { LD_SO_PREFIX LD_SO_ABI "d" LD_SO_SUFFIX, FLAG_ELF_LIBC6 },	\
> > -  { LD_SO_PREFIX LD_SO_ABI     LD_SO_SUFFIX, FLAG_ELF_LIBC6 },
> > -
> > -#define SYSDEP_KNOWN_LIBRARY_NAMES	\
> > -  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> > -  { "libm.so.6", FLAG_ELF_LIBC6 },
> > diff --git a/sysdeps/unix/sysv/linux/s390/ldconfig.h b/sysdeps/unix/sysv/linux/s390/ldconfig.h
> > index 83086ce843..b3fa8ceebe 100644
> > --- a/sysdeps/unix/sysv/linux/s390/ldconfig.h
> > +++ b/sysdeps/unix/sysv/linux/s390/ldconfig.h
> > @@ -16,10 +16,3 @@
> >     <https://www.gnu.org/licenses/>.  */
> >  
> >  #include <sysdeps/generic/ldconfig.h>
> > -
> > -#define SYSDEP_KNOWN_INTERPRETER_NAMES \
> > -  { "/lib/ld.so.1", FLAG_ELF_LIBC6 },	\
> > -  { "/lib/ld64.so.1", FLAG_ELF_LIBC6 },
> > -#define SYSDEP_KNOWN_LIBRARY_NAMES \
> > -  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> > -  { "libm.so.6", FLAG_ELF_LIBC6 },
> > diff --git a/sysdeps/unix/sysv/linux/x86_64/ldconfig.h b/sysdeps/unix/sysv/linux/x86_64/ldconfig.h
> > index 1089668f09..b3fa8ceebe 100644
> > --- a/sysdeps/unix/sysv/linux/x86_64/ldconfig.h
> > +++ b/sysdeps/unix/sysv/linux/x86_64/ldconfig.h
> > @@ -16,11 +16,3 @@
> >     <https://www.gnu.org/licenses/>.  */
> >  
> >  #include <sysdeps/generic/ldconfig.h>
> > -
> > -#define SYSDEP_KNOWN_INTERPRETER_NAMES \
> > -  { "/lib/ld-linux.so.2", FLAG_ELF_LIBC6 }, \
> > -  { "/libx32/ld-linux-x32.so.2", FLAG_ELF_LIBC6 }, \
> > -  { "/lib64/ld-linux-x86-64.so.2", FLAG_ELF_LIBC6 },
> > -#define SYSDEP_KNOWN_LIBRARY_NAMES \
> > -  { "libc.so.6", FLAG_ELF_LIBC6 },	\
> > -  { "libm.so.6", FLAG_ELF_LIBC6 },
  
Adhemerval Zanella March 4, 2022, 6:38 p.m. UTC | #5
On 02/03/2022 16:37, Raoni Fassina Firmino wrote:
> On Tue, Jan 11, 2022 at 04:22:43PM -0300, AL glibc-alpha wrote:
>>
>>
>> On 22/12/2021 12:31, Lucas A. M. Magalhaes via Libc-alpha wrote:
>>> I've tested it in a AT build and was able to build and link programs as
>>> expected. For other archs I try with build-many-glibcs.py, all
>>> succeeded.
>>>
>>> Any other suggestions on how to test this?
>>>
>>> Florian am I missing something? Should we add a restriction to cache
>>> just new libc6.so compatible libraries?
>>>
>>> -- 8< --
>>>
>>> The older libcs version are obsolete for over twenty years now. This
>>> commit removes special flags of libc.5.so and libc.4.so.. It assume that
>>> all libraries cached are libc.6.so compatible and wrote FLAG_ELF_LIBC6.
>>>
>>> Tested on x86_64, powerpc, powerpc64 and powerpc64le.
>>> Tested with build-many-glibcs.py for the other affected architectures.
>>
>> I think it makes sense to stop support libc.4 and libc.5 and assume
>> FLAG_ELF_LIBC6 by ldconfig.
>>
>> I also think it should be safe to just get rid of the arch-specific
>> SYSDEP_KNOWN_INTERPRETER_NAMES, at least in theory it should not be
>> used by the cache (so there is not need to actually classify it).
> 
> Lucas's RFC already removed it for a bunch of architectures, only
> leaving i386, aarch64 and mips64, and If my grep did not failed me It
> seems like the only uses of YSDEP_KNOWN_LIBRARY_NAMES and
> SYSDEP_KNOWN_INTERPRETER_NAMES were in known_libs and interpreters
> respectively, both removed in the RFC, so it seems that definitions can
> be safely removed (in the context of the RFC).
> 
> Not sure if there is a need for more opinions or consensus about this
> RFC's idea and approach to move forward with a proper patch for review.
> 
> 

I think the rationale of the patch is ok, it just need the the
SYSDEP_KNOWN_LIBRARY_NAMES and SYSDEP_KNOWN_INTERPRETER_NAMES
cleanup for aarch64, i386, and mips64.
  

Patch

diff --git a/elf/cache.c b/elf/cache.c
index 1c0dc5ee87..387dd11a05 100644
--- a/elf/cache.c
+++ b/elf/cache.c
@@ -158,6 +158,7 @@  struct cache_entry
 /* List of all cache entries.  */
 static struct cache_entry *entries;
 
+/* libc4, ELF and libc5 are unsupported */
 static const char *flag_descr[] =
 { "libc4", "ELF", "libc5", "libc6"};
 
@@ -169,14 +170,11 @@  print_entry (const char *lib, int flag, unsigned int osversion,
   printf ("\t%s (", lib);
   switch (flag & FLAG_TYPE_MASK)
     {
-    case FLAG_LIBC4:
-    case FLAG_ELF:
-    case FLAG_ELF_LIBC5:
     case FLAG_ELF_LIBC6:
       fputs (flag_descr[flag & FLAG_TYPE_MASK], stdout);
       break;
     default:
-      fputs (_("unknown"), stdout);
+      fputs (_("Unknown or unsupported flag"), stdout);
       break;
     }
   switch (flag & FLAG_REQUIRED_MASK)
diff --git a/elf/ldconfig.c b/elf/ldconfig.c
index 101d56ac8e..d64b134781 100644
--- a/elf/ldconfig.c
+++ b/elf/ldconfig.c
@@ -65,19 +65,6 @@ 
 
 #define PACKAGE _libc_intl_domainname
 
-static const struct
-{
-  const char *name;
-  int flag;
-} lib_types[] =
-{
-  {"libc4", FLAG_LIBC4},
-  {"libc5", FLAG_ELF_LIBC5},
-  {"libc6", FLAG_ELF_LIBC6},
-  {"glibc2", FLAG_ELF_LIBC6}
-};
-
-
 /* List of directories to handle.  */
 struct dir_entry
 {
@@ -471,25 +458,7 @@  add_dir_1 (const char *line, const char *from_file, int from_line)
 
   /* Search for an '=' sign.  */
   entry->path = xstrdup (line);
-  char *equal_sign = strchr (entry->path, '=');
-  if (equal_sign)
-    {
-      *equal_sign = '\0';
-      ++equal_sign;
-      entry->flag = FLAG_ANY;
-      for (i = 0; i < sizeof (lib_types) / sizeof (lib_types[0]); ++i)
-	if (strcmp (equal_sign, lib_types[i].name) == 0)
-	  {
-	    entry->flag = lib_types[i].flag;
-	    break;
-	  }
-      if (entry->flag == FLAG_ANY)
-	error (0, 0, _("%s is not a known library type"), equal_sign);
-    }
-  else
-    {
-      entry->flag = FLAG_ANY;
-    }
+  entry->flag = FLAG_ELF_LIBC6;
 
   /* Canonify path: for now only remove leading and trailing
      whitespace and the trailing slashes.  */
diff --git a/elf/readelflib.c b/elf/readelflib.c
index 10b10b6080..801c5587ab 100644
--- a/elf/readelflib.c
+++ b/elf/readelflib.c
@@ -44,7 +44,6 @@  process_elf_file (const char *file_name, const char *lib, int *flag,
 		  char **soname, void *file_contents, size_t file_length)
 {
   int i;
-  unsigned int j;
   unsigned int dynamic_addr;
   size_t dynamic_size;
   char *program_interpreter;
@@ -82,9 +81,8 @@  process_elf_file (const char *file_name, const char *lib, int *flag,
   elf_pheader = (ElfW(Phdr) *) (elf_header->e_phoff + file_contents);
   check_ptr (elf_pheader);
 
-  /* The library is an elf library, now search for soname and
-     libc5/libc6.  */
-  *flag = FLAG_ELF;
+  /* The library is an elf library   */
+  *flag = FLAG_ELF_LIBC6;
 
   /* The default ISA level is 0.  */
   *isa_level = 0;
@@ -111,16 +109,6 @@  process_elf_file (const char *file_name, const char *lib, int *flag,
 	  program_interpreter = (char *) (file_contents + segment->p_offset);
 	  check_ptr (program_interpreter);
 
-	  /* Check if this is enough to classify the binary.  */
-	  for (j = 0; j < sizeof (interpreters) / sizeof (interpreters [0]);
-	       ++j)
-	    if (strcmp (program_interpreter, interpreters[j].soname) == 0)
-	      {
-		*flag = interpreters[j].flag;
-		break;
-	      }
-	  break;
-
 	case PT_NOTE:
 	  if (!*osversion && segment->p_filesz >= 32 && segment->p_align >= 4)
 	    {
@@ -291,38 +279,16 @@  done:
   if (dynamic_strings == NULL)
     return 1;
 
-  /* Now read the DT_NEEDED and DT_SONAME entries.  */
+  /* Now read the DT_SONAME entries.  */
   for (dyn_entry = dynamic_segment; dyn_entry->d_tag != DT_NULL;
        ++dyn_entry)
     {
-      if (dyn_entry->d_tag == DT_NEEDED || dyn_entry->d_tag == DT_SONAME)
+      if (dyn_entry->d_tag == DT_SONAME)
 	{
 	  char *name = dynamic_strings + dyn_entry->d_un.d_val;
 	  check_ptr (name);
-
-	  if (dyn_entry->d_tag == DT_NEEDED)
-	    {
-
-	      if (*flag == FLAG_ELF)
-		{
-		  /* Check if this is enough to classify the binary.  */
-		  for (j = 0;
-		       j < sizeof (known_libs) / sizeof (known_libs [0]);
-		       ++j)
-		    if (strcmp (name, known_libs [j].soname) == 0)
-		      {
-			*flag = known_libs [j].flag;
-			break;
-		      }
-		}
-	    }
-
-	  else if (dyn_entry->d_tag == DT_SONAME)
-	    *soname = xstrdup (name);
-
-	  /* Do we have everything we need?  */
-	  if (*soname && *flag != FLAG_ELF)
-	    return 0;
+          *soname = xstrdup (name);
+          return 0;
 	}
     }
 
diff --git a/elf/readlib.c b/elf/readlib.c
index 64b20d7804..9164c1cda7 100644
--- a/elf/readlib.c
+++ b/elf/readlib.c
@@ -43,24 +43,6 @@  struct known_names
   int flag;
 };
 
-static struct known_names interpreters[] =
-{
-  { "/lib/" LD_SO, FLAG_ELF_LIBC6 },
-#ifdef SYSDEP_KNOWN_INTERPRETER_NAMES
-  SYSDEP_KNOWN_INTERPRETER_NAMES
-#endif
-};
-
-static struct known_names known_libs[] =
-{
-  { LIBC_SO, FLAG_ELF_LIBC6 },
-  { LIBM_SO, FLAG_ELF_LIBC6 },
-#ifdef SYSDEP_KNOWN_LIBRARY_NAMES
-  SYSDEP_KNOWN_LIBRARY_NAMES
-#endif
-};
-
-
 /* Check if string corresponds to a GDB Python file.  */
 static bool
 is_gdb_python_file (const char *name)
@@ -84,7 +66,8 @@  process_file (const char *real_file_name, const char *file_name,
   struct exec *aout_header;
 
   ret = 0;
-  *flag = FLAG_ANY;
+  /* Just set FLAG_ELF_LIBC6 as old formats are not supported anymore.  */
+  *flag = FLAG_ELF_LIBC6;
   *soname = NULL;
 
   file = fopen (real_file_name, "rb");
@@ -151,7 +134,6 @@  process_file (const char *real_file_name, const char *file_name,
 	    *dot = '\0';
 	}
       *soname = copy;
-      *flag = FLAG_LIBC4;
       goto done;
     }
 
@@ -192,9 +174,6 @@  implicit_soname (const char *lib, int flag)
 {
   char *soname = xstrdup (lib);
 
-  if ((flag & FLAG_TYPE_MASK) != FLAG_LIBC4)
-    return soname;
-
   /* Aout files don't have a soname, just return the name
      including the major number.  */
   char *major = strstr (soname, ".so.");
diff --git a/sysdeps/unix/sysv/linux/arc/ldconfig.h b/sysdeps/unix/sysv/linux/arc/ldconfig.h
index 8c776fca9e..02ed826283 100644
--- a/sysdeps/unix/sysv/linux/arc/ldconfig.h
+++ b/sysdeps/unix/sysv/linux/arc/ldconfig.h
@@ -17,11 +17,3 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdeps/generic/ldconfig.h>
-
-#define SYSDEP_KNOWN_INTERPRETER_NAMES 		\
-  { "/lib/ld-linux-arc.so.2", FLAG_ELF_LIBC6 },	\
-  { "/lib/ld-linux-arceb.so.2", FLAG_ELF_LIBC6 },
-
-#define SYSDEP_KNOWN_LIBRARY_NAMES 	\
-  { "libc.so.6", FLAG_ELF_LIBC6 },	\
-  { "libm.so.6", FLAG_ELF_LIBC6 },
diff --git a/sysdeps/unix/sysv/linux/arm/ldconfig.h b/sysdeps/unix/sysv/linux/arm/ldconfig.h
index d839470cfe..b3fa8ceebe 100644
--- a/sysdeps/unix/sysv/linux/arm/ldconfig.h
+++ b/sysdeps/unix/sysv/linux/arm/ldconfig.h
@@ -16,10 +16,3 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdeps/generic/ldconfig.h>
-
-#define SYSDEP_KNOWN_INTERPRETER_NAMES \
-  { "/lib/ld-linux.so.3", FLAG_ELF_LIBC6 }, \
-  { "/lib/ld-linux-armhf.so.3", FLAG_ELF_LIBC6 },
-#define SYSDEP_KNOWN_LIBRARY_NAMES \
-  { "libc.so.6", FLAG_ELF_LIBC6 },	\
-  { "libm.so.6", FLAG_ELF_LIBC6 },
diff --git a/sysdeps/unix/sysv/linux/csky/ldconfig.h b/sysdeps/unix/sysv/linux/csky/ldconfig.h
index eeda37e4a8..6861f71327 100644
--- a/sysdeps/unix/sysv/linux/csky/ldconfig.h
+++ b/sysdeps/unix/sysv/linux/csky/ldconfig.h
@@ -26,9 +26,3 @@ 
 #else
 # define LD_SO_ABI "cskyv2"
 #endif
-
-#define SYSDEP_KNOWN_INTERPRETER_NAMES	\
-  { LD_SO_PREFIX LD_SO_ABI LD_SO_SUFFIX, FLAG_ELF_LIBC6 },
-#define SYSDEP_KNOWN_LIBRARY_NAMES	\
-  { "libc.so.6", FLAG_ELF_LIBC6 },	\
-  { "libm.so.6", FLAG_ELF_LIBC6 },
diff --git a/sysdeps/unix/sysv/linux/ia64/ldconfig.h b/sysdeps/unix/sysv/linux/ia64/ldconfig.h
index 53685659ed..b3fa8ceebe 100644
--- a/sysdeps/unix/sysv/linux/ia64/ldconfig.h
+++ b/sysdeps/unix/sysv/linux/ia64/ldconfig.h
@@ -16,9 +16,3 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdeps/generic/ldconfig.h>
-
-#define SYSDEP_KNOWN_INTERPRETER_NAMES \
-  { "/lib/ld-linux.so.2", FLAG_ELF_LIBC6 },
-#define SYSDEP_KNOWN_LIBRARY_NAMES \
-  { "libc.so.6", FLAG_ELF_LIBC6 },	\
-  { "libm.so.6", FLAG_ELF_LIBC6 },
diff --git a/sysdeps/unix/sysv/linux/powerpc/ldconfig.h b/sysdeps/unix/sysv/linux/powerpc/ldconfig.h
index 09d75b3dec..d0935d541b 100644
--- a/sysdeps/unix/sysv/linux/powerpc/ldconfig.h
+++ b/sysdeps/unix/sysv/linux/powerpc/ldconfig.h
@@ -17,11 +17,3 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdeps/generic/ldconfig.h>
-
-#define SYSDEP_KNOWN_INTERPRETER_NAMES \
-  { "/lib/ld.so.1", FLAG_ELF_LIBC6 },	\
-  { "/lib64/ld64.so.1", FLAG_ELF_LIBC6 }, \
-  { "/lib64/ld64.so.2", FLAG_ELF_LIBC6 },
-#define SYSDEP_KNOWN_LIBRARY_NAMES \
-  { "libc.so.6", FLAG_ELF_LIBC6 },	\
-  { "libm.so.6", FLAG_ELF_LIBC6 },
diff --git a/sysdeps/unix/sysv/linux/riscv/ldconfig.h b/sysdeps/unix/sysv/linux/riscv/ldconfig.h
index e6e7d271ad..24aae5155a 100644
--- a/sysdeps/unix/sysv/linux/riscv/ldconfig.h
+++ b/sysdeps/unix/sysv/linux/riscv/ldconfig.h
@@ -17,20 +17,3 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdeps/generic/ldconfig.h>
-
-#define LD_SO_PREFIX "/lib/ld-linux-"
-#define LD_SO_SUFFIX ".so.1"
-
-#if __riscv_xlen == 64
-# define LD_SO_ABI "riscv64-lp64"
-#else
-# define LD_SO_ABI "riscv32-ilp32"
-#endif
-
-#define SYSDEP_KNOWN_INTERPRETER_NAMES				\
-  { LD_SO_PREFIX LD_SO_ABI "d" LD_SO_SUFFIX, FLAG_ELF_LIBC6 },	\
-  { LD_SO_PREFIX LD_SO_ABI     LD_SO_SUFFIX, FLAG_ELF_LIBC6 },
-
-#define SYSDEP_KNOWN_LIBRARY_NAMES	\
-  { "libc.so.6", FLAG_ELF_LIBC6 },	\
-  { "libm.so.6", FLAG_ELF_LIBC6 },
diff --git a/sysdeps/unix/sysv/linux/s390/ldconfig.h b/sysdeps/unix/sysv/linux/s390/ldconfig.h
index 83086ce843..b3fa8ceebe 100644
--- a/sysdeps/unix/sysv/linux/s390/ldconfig.h
+++ b/sysdeps/unix/sysv/linux/s390/ldconfig.h
@@ -16,10 +16,3 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdeps/generic/ldconfig.h>
-
-#define SYSDEP_KNOWN_INTERPRETER_NAMES \
-  { "/lib/ld.so.1", FLAG_ELF_LIBC6 },	\
-  { "/lib/ld64.so.1", FLAG_ELF_LIBC6 },
-#define SYSDEP_KNOWN_LIBRARY_NAMES \
-  { "libc.so.6", FLAG_ELF_LIBC6 },	\
-  { "libm.so.6", FLAG_ELF_LIBC6 },
diff --git a/sysdeps/unix/sysv/linux/x86_64/ldconfig.h b/sysdeps/unix/sysv/linux/x86_64/ldconfig.h
index 1089668f09..b3fa8ceebe 100644
--- a/sysdeps/unix/sysv/linux/x86_64/ldconfig.h
+++ b/sysdeps/unix/sysv/linux/x86_64/ldconfig.h
@@ -16,11 +16,3 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdeps/generic/ldconfig.h>
-
-#define SYSDEP_KNOWN_INTERPRETER_NAMES \
-  { "/lib/ld-linux.so.2", FLAG_ELF_LIBC6 }, \
-  { "/libx32/ld-linux-x32.so.2", FLAG_ELF_LIBC6 }, \
-  { "/lib64/ld-linux-x86-64.so.2", FLAG_ELF_LIBC6 },
-#define SYSDEP_KNOWN_LIBRARY_NAMES \
-  { "libc.so.6", FLAG_ELF_LIBC6 },	\
-  { "libm.so.6", FLAG_ELF_LIBC6 },