[v2] Remove NO_CTORS_DTORS_SECTIONS macro

Message ID 87lflpcsg7.fsf@oldenburg2.str.redhat.com
State Committed
Headers
Series [v2] Remove NO_CTORS_DTORS_SECTIONS macro |

Commit Message

Florian Weimer May 18, 2020, 12:56 p.m. UTC
  This was originally added to support binutils older than version
2.22:

  <https://sourceware.org/ml/libc-alpha/2010-12/msg00051.html>

Since 2.22 is older than the minimum required binutils version
for building glibc, we no longer need this.  (The changes do
not impact the statically linked startup code.)

---
Changes since v1:
 Rebased on top of current master.
 Retested on x86_64-linux-gnu and i686-linux-gnu,
  built with build-many-glibcs.py.

 Makerules                           |  6 ++---
 config.h.in                         |  3 ---
 configure                           | 53 -------------------------------------
 configure.ac                        | 30 ---------------------
 csu/init-first.c                    |  4 ---
 elf/Makefile                        |  2 +-
 elf/sofini.c                        | 12 ---------
 elf/soinit.c                        | 43 ------------------------------
 include/libc-internal.h             |  3 ---
 sysdeps/mach/hurd/i386/init-first.c |  5 ----
 10 files changed, 3 insertions(+), 158 deletions(-)
  

Comments

Andreas Schwab May 18, 2020, 1:22 p.m. UTC | #1
On Mai 18 2020, Florian Weimer via Libc-alpha wrote:

> This was originally added to support binutils older than version
> 2.22:
>
>   <https://sourceware.org/ml/libc-alpha/2010-12/msg00051.html>
>
> Since 2.22 is older than the minimum required binutils version
> for building glibc, we no longer need this.  (The changes do
> not impact the statically linked startup code.)

Ok.

Andreas.
  

Patch

diff --git a/Makerules b/Makerules
index 1e9c18f0d8..341db86c7e 100644
--- a/Makerules
+++ b/Makerules
@@ -690,8 +690,7 @@  $(common-objpfx)linkobj/libc.so: link-libc-deps = # empty
 
 # Use our own special initializer and finalizer files for the libc.so
 # libraries.
-$(common-objpfx)libc.so: $(elf-objpfx)soinit.os \
-			 $(common-objpfx)libc_pic.os$(libc_pic_clean) \
+$(common-objpfx)libc.so: $(common-objpfx)libc_pic.os$(libc_pic_clean) \
 			 $(elf-objpfx)sofini.os \
 			 $(elf-objpfx)interp.os \
 			 $(elf-objpfx)ld.so \
@@ -699,8 +698,7 @@  $(common-objpfx)libc.so: $(elf-objpfx)soinit.os \
 	$(build-shlib)
 	$(call after-link,$@)
 
-$(common-objpfx)linkobj/libc.so: $(elf-objpfx)soinit.os \
-			 $(common-objpfx)linkobj/libc_pic.a \
+$(common-objpfx)linkobj/libc.so: $(common-objpfx)linkobj/libc_pic.a \
 			 $(elf-objpfx)sofini.os \
 			 $(elf-objpfx)interp.os \
 			 $(elf-objpfx)ld.so \
diff --git a/config.h.in b/config.h.in
index dea43df438..cd7d4df3ed 100644
--- a/config.h.in
+++ b/config.h.in
@@ -157,9 +157,6 @@ 
 /* Define if multi-arch DSOs should be generated.  */
 #undef USE_MULTIARCH
 
-/* Define if `.ctors' and `.dtors' sections shouldn't be used.  */
-#undef	NO_CTORS_DTORS_SECTIONS
-
 /* Define if obsolete RPC code should be made available for user-level code
    to link against.  */
 #undef LINK_OBSOLETE_RPC
diff --git a/configure b/configure
index 8df47d61f8..b8ef8c7a51 100755
--- a/configure
+++ b/configure
@@ -5753,59 +5753,6 @@  if test $libc_cv_have_sdata_section = yes; then
 
 fi
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use .ctors/.dtors header and trailer" >&5
-$as_echo_n "checking whether to use .ctors/.dtors header and trailer... " >&6; }
-if ${libc_cv_ctors_header+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-    libc_cv_ctors_header=yes
-  cat > conftest.c <<EOF
-int _start (void) { return 0; }
-int __start (void) { return 0; }
-
-__attribute__ ((constructor)) void ctor (void) { asm (""); }
-__attribute__ ((destructor))  void dtor (void) { asm (""); }
-
-EOF
-if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp -o conftest
-		       conftest.c -static -nostartfiles -nostdlib
-		       1>&5'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
-        if $READELF -WS conftest$ac_exeext | $AWK '
-	{ gsub(/\[ */, "[") }
-	$2 == ".ctors" || $2 == ".dtors" {
-	  size = strtonum("0x" $6)
-	  align = strtonum("0x" $NF)
-	  seen[$2] = 1
-	  stub[$2] = size == align * 2
-	}
-	END {
-	  ctors_ok = !seen[".ctors"] || stub[".ctors"]
-	  dtors_ok = !seen[".dtors"] || stub[".dtors"]
-	  exit ((ctors_ok && dtors_ok) ? 0 : 1)
-	}
-      '; then :
-  libc_cv_ctors_header=no
-fi
-
-else
-        as_fn_error $? "missing __attribute__ ((constructor)) support??" "$LINENO" 5
-
-fi
-rm -f conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_ctors_header" >&5
-$as_echo "$libc_cv_ctors_header" >&6; }
-if test $libc_cv_ctors_header = no; then
-  $as_echo "#define NO_CTORS_DTORS_SECTIONS 1" >>confdefs.h
-
-fi
-
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libunwind-support in compiler" >&5
 $as_echo_n "checking for libunwind-support in compiler... " >&6; }
 if ${libc_cv_cc_with_libunwind+:} false; then :
diff --git a/configure.ac b/configure.ac
index 5f229679a9..ff00591fd4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1251,36 +1251,6 @@  if test $libc_cv_have_sdata_section = yes; then
   AC_DEFINE(HAVE_SDATA_SECTION)
 fi
 
-AC_CACHE_CHECK(whether to use .ctors/.dtors header and trailer,
-	       libc_cv_ctors_header, [dnl
-  libc_cv_ctors_header=yes
-  LIBC_TRY_LINK_STATIC([
-__attribute__ ((constructor)) void ctor (void) { asm (""); }
-__attribute__ ((destructor))  void dtor (void) { asm (""); }
-],
-	      [dnl
-      AS_IF([$READELF -WS conftest$ac_exeext | $AWK '
-	{ gsub(/\@<:@ */, "@<:@") }
-	$2 == ".ctors" || $2 == ".dtors" {
-	  size = strtonum("0x" $6)
-	  align = strtonum("0x" $NF)
-	  seen@<:@$2@:>@ = 1
-	  stub@<:@$2@:>@ = size == align * 2
-	}
-	END {
-	  ctors_ok = !seen@<:@".ctors"@:>@ || stub@<:@".ctors"@:>@
-	  dtors_ok = !seen@<:@".dtors"@:>@ || stub@<:@".dtors"@:>@
-	  exit ((ctors_ok && dtors_ok) ? 0 : 1)
-	}
-      '], [libc_cv_ctors_header=no])
-    ], [dnl
-      AC_MSG_ERROR([missing __attribute__ ((constructor)) support??])
-    ])
-])
-if test $libc_cv_ctors_header = no; then
-  AC_DEFINE(NO_CTORS_DTORS_SECTIONS)
-fi
-
 AC_CACHE_CHECK(for libunwind-support in compiler,
 	       libc_cv_cc_with_libunwind, [
   cat > conftest.c <<EOF
diff --git a/csu/init-first.c b/csu/init-first.c
index d214af7116..47aaacdbd0 100644
--- a/csu/init-first.c
+++ b/csu/init-first.c
@@ -73,10 +73,6 @@  _init_first (int argc, char **argv, char **envp)
 #endif
 
   __init_misc (argc, argv, envp);
-
-#if defined SHARED && !defined NO_CTORS_DTORS_SECTIONS
-  __libc_global_ctors ();
-#endif
 }
 
 /* This function is defined here so that if this file ever gets into
diff --git a/elf/Makefile b/elf/Makefile
index 77da61ae64..6fe1df90bb 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -98,7 +98,7 @@  ld-map		= $(common-objpfx)ld.map
 endif
 
 ifeq (yes,$(build-shared))
-extra-objs	= $(all-rtld-routines:%=%.os) soinit.os sofini.os interp.os
+extra-objs	= $(all-rtld-routines:%=%.os) sofini.os interp.os
 generated	+= librtld.os dl-allobjs.os ld.so ldd
 install-others	= $(inst_rtlddir)/$(rtld-installed-name)
 install-bin-script = ldd
diff --git a/elf/sofini.c b/elf/sofini.c
index 13e74b7903..1c526fd603 100644
--- a/elf/sofini.c
+++ b/elf/sofini.c
@@ -1,15 +1,3 @@ 
-/* Finalizer module for ELF shared C library.  This provides terminating
-   null pointer words in the `.ctors' and `.dtors' sections.  */
-
-#ifndef NO_CTORS_DTORS_SECTIONS
-static void (*const __CTOR_END__[1]) (void)
-     __attribute__ ((used, section (".ctors")))
-     = { 0 };
-static void (*const __DTOR_END__[1]) (void)
-     __attribute__ ((used, section (".dtors")))
-     = { 0 };
-#endif
-
 /* Terminate the frame unwind info section with a 4byte 0 as a sentinel;
    this would be the 'length' field in a real FDE.  */
 
diff --git a/elf/soinit.c b/elf/soinit.c
deleted file mode 100644
index 538eb68186..0000000000
--- a/elf/soinit.c
+++ /dev/null
@@ -1,43 +0,0 @@ 
-/* Initializer module for building the ELF shared C library.  This file and
-   sofini.c do the work normally done by crtbeginS.o and crtendS.o, to wrap
-   the `.ctors' and `.dtors' sections so the lists are terminated, and
-   calling those lists of functions.  */
-
-#ifndef NO_CTORS_DTORS_SECTIONS
-# include <stdlib.h>
-
-static void (*const __CTOR_LIST__[1]) (void)
-  __attribute__ ((used, section (".ctors")))
-  = { (void (*) (void)) -1 };
-static void (*const __DTOR_LIST__[1]) (void)
-  __attribute__ ((used, section (".dtors")))
-  = { (void (*) (void)) -1 };
-
-static inline void
-run_hooks (void (*const list[]) (void))
-{
-  while (*++list)
-    (**list) ();
-}
-
-/* This function will be called from _init_first in init-first.c.  */
-void
-__libc_global_ctors (void)
-{
-  /* Call constructor functions.  */
-  run_hooks (__CTOR_LIST__);
-}
-
-
-/* This function becomes the DT_FINI termination function
-   for the C library.  */
-void
-__libc_fini (void)
-{
-  /* Call destructor functions.  */
-  run_hooks (__DTOR_LIST__);
-}
-
-void (*_fini_ptr) (void) __attribute__ ((section (".fini_array")))
-     = &__libc_fini;
-#endif
diff --git a/include/libc-internal.h b/include/libc-internal.h
index 4c74f6ba60..729db7918e 100644
--- a/include/libc-internal.h
+++ b/include/libc-internal.h
@@ -24,9 +24,6 @@ 
 /* Initialize the `__libc_enable_secure' flag.  */
 extern void __libc_init_secure (void);
 
-/* This function will be called from _init_first in init-first.c.  */
-extern void __libc_global_ctors (void);
-
 /* Discover the tick frequency of the machine if something goes wrong,
    we return 0, an impossible hertz.  */
 extern int __profile_frequency (void);
diff --git a/sysdeps/mach/hurd/i386/init-first.c b/sysdeps/mach/hurd/i386/init-first.c
index a7dd4895d9..5e66602d4b 100644
--- a/sysdeps/mach/hurd/i386/init-first.c
+++ b/sysdeps/mach/hurd/i386/init-first.c
@@ -33,7 +33,6 @@ 
 
 extern void __mach_init (void);
 extern void __init_misc (int, char **, char **);
-extern void __libc_global_ctors (void);
 
 unsigned long int __hurd_threadvar_stack_offset;
 unsigned long int __hurd_threadvar_stack_mask;
@@ -83,10 +82,6 @@  posixland_init (int argc, char **argv, char **envp)
   _dl_non_dynamic_init ();
 #endif
   __init_misc (argc, argv, envp);
-
-#if defined SHARED && !defined NO_CTORS_DTORS_SECTIONS
-  __libc_global_ctors ();
-#endif
 }