[2/2] Remove dl-librecon.h header.

Message ID 20220221175922.3909198-3-adhemerval.zanella@linaro.org
State Superseded
Delegated to: Florian Weimer
Headers
Series Remove distinguish library code |

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

Adhemerval Zanella Netto Feb. 21, 2022, 5:59 p.m. UTC
  The Linux version used by i686 and m68k provide three overrrides for
generic code:

  1. DISTINGUISH_LIB_VERSIONS to print additional information when
     libc5 is used by a dependency.

  2. EXTRA_LD_ENVVARS to that enabled LD_LIBRARY_VERSION environment
     variable.

  3. EXTRA_UNSECURE_ENVVARS to add two environment variables related
     to aout support.

None are really requires, it has some decades since libc5 or aout
suppported was removed and Linux even remove support for aout files.
The LD_LIBRARY_VERSION is also dead code, dl_correct_cache_id is not
used anywhere.

Checked on x86_64-linux-gnu and i686-linux-gnu.
---
 NEWS                                       |  2 +
 elf/dl-support.c                           | 13 +----
 elf/rtld.c                                 | 25 +--------
 sysdeps/generic/dl-librecon.h              | 24 ---------
 sysdeps/generic/ldsodefs.h                 |  3 --
 sysdeps/unix/sysv/linux/i386/dl-librecon.h | 59 ----------------------
 sysdeps/unix/sysv/linux/m68k/dl-librecon.h |  1 -
 7 files changed, 6 insertions(+), 121 deletions(-)
 delete mode 100644 sysdeps/generic/dl-librecon.h
 delete mode 100644 sysdeps/unix/sysv/linux/i386/dl-librecon.h
 delete mode 100644 sysdeps/unix/sysv/linux/m68k/dl-librecon.h
  

Comments

Florian Weimer Feb. 28, 2022, 7:11 p.m. UTC | #1
* Adhemerval Zanella via Libc-alpha:

> diff --git a/elf/dl-support.c b/elf/dl-support.c
> index 1d648ce3a6..fa9fcdbe5a 100644
> --- a/elf/dl-support.c
> +++ b/elf/dl-support.c

> @@ -370,15 +367,9 @@ _dl_non_dynamic_init (void)
>  
>    if (__libc_enable_secure)
>      {
> -      static const char unsecure_envvars[] =
> -	UNSECURE_ENVVARS
> -#ifdef EXTRA_UNSECURE_ENVVARS
> -	EXTRA_UNSECURE_ENVVARS
> -#endif
> -	;
> -      const char *cp = unsecure_envvars;
> +      const char *cp = UNSECURE_ENVVARS;
>  
> -      while (cp < unsecure_envvars + sizeof (unsecure_envvars))
> +      while (cp < UNSECURE_ENVVARS + sizeof (UNSECURE_ENVVARS))
>  	{
>  	  __unsetenv (cp);
>  	  cp = (const char *) __rawmemchr (cp, '\0') + 1;

Please keep unsecure_envvars.  I think C does not guarantee that there
is just one array for UNSECURE_ENVVARS.

Rest looks okay to me.

Thanks,
Florian
  
Adhemerval Zanella Netto March 4, 2022, 12:42 p.m. UTC | #2
On 28/02/2022 16:11, Florian Weimer wrote:
> * Adhemerval Zanella via Libc-alpha:
> 
>> diff --git a/elf/dl-support.c b/elf/dl-support.c
>> index 1d648ce3a6..fa9fcdbe5a 100644
>> --- a/elf/dl-support.c
>> +++ b/elf/dl-support.c
> 
>> @@ -370,15 +367,9 @@ _dl_non_dynamic_init (void)
>>  
>>    if (__libc_enable_secure)
>>      {
>> -      static const char unsecure_envvars[] =
>> -	UNSECURE_ENVVARS
>> -#ifdef EXTRA_UNSECURE_ENVVARS
>> -	EXTRA_UNSECURE_ENVVARS
>> -#endif
>> -	;
>> -      const char *cp = unsecure_envvars;
>> +      const char *cp = UNSECURE_ENVVARS;
>>  
>> -      while (cp < unsecure_envvars + sizeof (unsecure_envvars))
>> +      while (cp < UNSECURE_ENVVARS + sizeof (UNSECURE_ENVVARS))
>>  	{
>>  	  __unsetenv (cp);
>>  	  cp = (const char *) __rawmemchr (cp, '\0') + 1;
> 
> Please keep unsecure_envvars.  I think C does not guarantee that there
> is just one array for UNSECURE_ENVVARS.
> 

Ack.

> Rest looks okay to me.
>
  

Patch

diff --git a/NEWS b/NEWS
index bbbcc55b0c..2a200164d4 100644
--- a/NEWS
+++ b/NEWS
@@ -22,6 +22,8 @@  Deprecated and removed features, and other changes affecting compatibility:
   provided through NT_GNU_ABI_TAG ELF note and also printed when libc.so
   is issued directly.
 
+* On Linux, The LD_LIBRARY_VERSION environment variable has been removed.
+
 Changes to build and runtime requirements:
 
   [Add changes to build and runtime requirements here]
diff --git a/elf/dl-support.c b/elf/dl-support.c
index 1d648ce3a6..fa9fcdbe5a 100644
--- a/elf/dl-support.c
+++ b/elf/dl-support.c
@@ -35,7 +35,6 @@ 
 #include <dl-machine.h>
 #include <libc-lock.h>
 #include <dl-cache.h>
-#include <dl-librecon.h>
 #include <dl-procinfo.h>
 #include <unsecvars.h>
 #include <hp-timing.h>
@@ -158,8 +157,6 @@  struct link_map *_dl_initfirst;
 /* Descriptor to write debug messages to.  */
 int _dl_debug_fd = STDERR_FILENO;
 
-int _dl_correct_cache_id = _DL_CACHE_DEFAULT_ID;
-
 ElfW(auxv_t) *_dl_auxv;
 const ElfW(Phdr) *_dl_phdr;
 size_t _dl_phnum;
@@ -370,15 +367,9 @@  _dl_non_dynamic_init (void)
 
   if (__libc_enable_secure)
     {
-      static const char unsecure_envvars[] =
-	UNSECURE_ENVVARS
-#ifdef EXTRA_UNSECURE_ENVVARS
-	EXTRA_UNSECURE_ENVVARS
-#endif
-	;
-      const char *cp = unsecure_envvars;
+      const char *cp = UNSECURE_ENVVARS;
 
-      while (cp < unsecure_envvars + sizeof (unsecure_envvars))
+      while (cp < UNSECURE_ENVVARS + sizeof (UNSECURE_ENVVARS))
 	{
 	  __unsetenv (cp);
 	  cp = (const char *) __rawmemchr (cp, '\0') + 1;
diff --git a/elf/rtld.c b/elf/rtld.c
index 11110cb436..222109e9f6 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -32,7 +32,6 @@ 
 #include <fpu_control.h>
 #include <hp-timing.h>
 #include <libc-lock.h>
-#include <dl-librecon.h>
 #include <unsecvars.h>
 #include <dl-cache.h>
 #include <dl-osinfo.h>
@@ -365,7 +364,6 @@  struct rtld_global_ro _rtld_global_ro attribute_relro =
     ._dl_sysinfo = DL_SYSINFO_DEFAULT,
 #endif
     ._dl_debug_fd = STDERR_FILENO,
-    ._dl_correct_cache_id = _DL_CACHE_DEFAULT_ID,
 #if !HAVE_TUNABLES
     ._dl_hwcap_mask = HWCAP_IMPORTANT,
 #endif
@@ -1697,10 +1695,6 @@  dl_main (const ElfW(Phdr) *phdr,
       if (main_map->l_ld == NULL)
 	_exit (1);
 
-      /* We allow here some platform specific code.  */
-#ifdef DISTINGUISH_LIB_VERSIONS
-      DISTINGUISH_LIB_VERSIONS;
-#endif
       _exit (has_interp ? 0 : 2);
     }
 
@@ -2654,29 +2648,14 @@  process_envvars (struct dl_main_state *state)
 		= _dl_strtoul (&envline[21], NULL) > 1;
 	    }
 	  break;
-
-	  /* We might have some extra environment variable to handle.  This
-	     is tricky due to the pre-processing of the length of the name
-	     in the switch statement here.  The code here assumes that added
-	     environment variables have a different length.  */
-#ifdef EXTRA_LD_ENVVARS
-	  EXTRA_LD_ENVVARS
-#endif
 	}
     }
 
   /* Extra security for SUID binaries.  Remove all dangerous environment
      variables.  */
-  if (__builtin_expect (__libc_enable_secure, 0))
+  if (__glibc_unlikely (__libc_enable_secure))
     {
-      static const char unsecure_envvars[] =
-#ifdef EXTRA_UNSECURE_ENVVARS
-	EXTRA_UNSECURE_ENVVARS
-#endif
-	UNSECURE_ENVVARS;
-      const char *nextp;
-
-      nextp = unsecure_envvars;
+      const char *nextp = UNSECURE_ENVVARS;
       do
 	{
 	  unsetenv (nextp);
diff --git a/sysdeps/generic/dl-librecon.h b/sysdeps/generic/dl-librecon.h
deleted file mode 100644
index 19fc70cb29..0000000000
--- a/sysdeps/generic/dl-librecon.h
+++ /dev/null
@@ -1,24 +0,0 @@ 
-/* Optional code to distinguish library flavours.
-   Copyright (C) 1998-2022 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <https://www.gnu.org/licenses/>.  */
-
-#ifndef _DL_LIBRECON_H
-#define _DL_LIBRECON_H	1
-
-/* In the general case we don't do anything.  */
-
-#endif /* dl-librecon.h */
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index 97cbe41171..d0d94a0b77 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -601,9 +601,6 @@  struct rtld_global_ro
   /* Default floating-point control word.  */
   EXTERN fpu_control_t _dl_fpu_control;
 
-  /* Expected cache ID.  */
-  EXTERN int _dl_correct_cache_id;
-
   /* Mask for hardware capabilities that are available.  */
   EXTERN uint64_t _dl_hwcap;
 
diff --git a/sysdeps/unix/sysv/linux/i386/dl-librecon.h b/sysdeps/unix/sysv/linux/i386/dl-librecon.h
deleted file mode 100644
index 78e3f0d02d..0000000000
--- a/sysdeps/unix/sysv/linux/i386/dl-librecon.h
+++ /dev/null
@@ -1,59 +0,0 @@ 
-/* Optional code to distinguish library flavours.
-   Copyright (C) 1998-2022 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <https://www.gnu.org/licenses/>.  */
-
-#ifndef _DL_LIBRECON_H
-
-#define DISTINGUISH_LIB_VERSIONS \
-  do									      \
-    {									      \
-      /* We have to find out whether the binary is linked against	      \
-	 libc 5 or glibc.  We do this by looking at all the DT_NEEDED	      \
-	 entries.  If one is libc.so.5 this is a libc 5 linked binary.  */    \
-      if (main_map->l_info[DT_NEEDED])					      \
-	{								      \
-	  /* We have dependencies.  */					      \
-	  const ElfW(Dyn) *d;						      \
-	  const char *strtab;						      \
-									      \
-	  strtab = (const char *) D_PTR (main_map, l_info[DT_STRTAB]);	      \
-									      \
-	  for (d = main_map->l_ld; d->d_tag != DT_NULL; ++d)		      \
-	    if (d->d_tag == DT_NEEDED					      \
-		&& strcmp (strtab + d->d_un.d_val, "libc.so.5") == 0)	      \
-	      break;							      \
-									      \
-	  /* We print a `5' or `6' depending on the outcome.  */	      \
-	  _dl_printf (d->d_tag != DT_NULL ? "5\n" : "6\n");		      \
-	}								      \
-    }									      \
-  while (0)
-
-/* Recognizing extra environment variables.  */
-#define EXTRA_LD_ENVVARS \
-  case 15:								      \
-    if (memcmp (envline, "LIBRARY_VERSION", 15) == 0)			      \
-      GLRO(dl_correct_cache_id) = envline[16] == '5' ? 2 : 3;		      \
-    break;								      \
-
-/* Extra unsecure variables.  The names are all stuffed in a single
-   string which means they have to be terminated with a '\0' explicitly.  */
-#define EXTRA_UNSECURE_ENVVARS \
-  "LD_AOUT_LIBRARY_PATH\0"						      \
-  "LD_AOUT_PRELOAD\0"
-
-#endif /* dl-librecon.h */
diff --git a/sysdeps/unix/sysv/linux/m68k/dl-librecon.h b/sysdeps/unix/sysv/linux/m68k/dl-librecon.h
deleted file mode 100644
index dbb4e75712..0000000000
--- a/sysdeps/unix/sysv/linux/m68k/dl-librecon.h
+++ /dev/null
@@ -1 +0,0 @@ 
-#include <sysdeps/unix/sysv/linux/i386/dl-librecon.h>