]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Reduce the statically linked startup code [BZ #23323]
authorFlorian Weimer <fweimer@redhat.com>
Thu, 25 Feb 2021 11:10:57 +0000 (12:10 +0100)
committerFlorian Weimer <fweimer@redhat.com>
Thu, 25 Feb 2021 11:13:02 +0000 (12:13 +0100)
It turns out the startup code in csu/elf-init.c has a perfect pair of
ROP gadgets (see Marco-Gisbert and Ripoll-Ripoll, "return-to-csu: A
New Method to Bypass 64-bit Linux ASLR").  These functions are not
needed in dynamically-linked binaries because DT_INIT/DT_INIT_ARRAY
are already processed by the dynamic linker.  However, the dynamic
linker skipped the main program for some reason.  For maximum
backwards compatibility, this is not changed, and instead, the main
map is consulted from __libc_start_main if the init function argument
is a NULL pointer.

For statically linked binaries, the old approach based on linker
symbols is still used because there is nothing else available.

A new symbol version __libc_start_main@@GLIBC_2.34 is introduced because
new binaries running on an old libc would not run their ELF
constructors, leading to difficult-to-debug issues.

63 files changed:
csu/Makefile
csu/Versions
csu/elf-init.c [deleted file]
csu/libc-start.c
elf/dl-init.c
sysdeps/aarch64/start.S
sysdeps/alpha/start.S
sysdeps/arc/start.S
sysdeps/arm/start.S
sysdeps/csky/abiv2/start.S
sysdeps/generic/ldsodefs.h
sysdeps/hppa/dl-lookupcfg.h
sysdeps/hppa/start.S
sysdeps/i386/start.S
sysdeps/ia64/dl-lookupcfg.h
sysdeps/ia64/start.S
sysdeps/m68k/start.S
sysdeps/mach/hurd/i386/libc.abilist
sysdeps/microblaze/start.S
sysdeps/mips/start.S
sysdeps/nios2/start.S
sysdeps/powerpc/powerpc32/start.S
sysdeps/powerpc/powerpc64/start.S
sysdeps/riscv/start.S
sysdeps/s390/s390-32/start.S
sysdeps/s390/s390-64/start.S
sysdeps/sh/start.S
sysdeps/sparc/sparc32/start.S
sysdeps/sparc/sparc64/start.S
sysdeps/unix/sysv/linux/aarch64/libc.abilist
sysdeps/unix/sysv/linux/alpha/libc.abilist
sysdeps/unix/sysv/linux/arc/libc.abilist
sysdeps/unix/sysv/linux/arm/be/libc.abilist
sysdeps/unix/sysv/linux/arm/le/libc.abilist
sysdeps/unix/sysv/linux/csky/libc.abilist
sysdeps/unix/sysv/linux/hppa/libc.abilist
sysdeps/unix/sysv/linux/i386/libc.abilist
sysdeps/unix/sysv/linux/ia64/libc.abilist
sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
sysdeps/unix/sysv/linux/nios2/libc.abilist
sysdeps/unix/sysv/linux/powerpc/libc-start.c
sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
sysdeps/unix/sysv/linux/sh/be/libc.abilist
sysdeps/unix/sysv/linux/sh/le/libc.abilist
sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
sysdeps/x86_64/start.S

index c9385df2e9e8d619f5560f73204d398e95600b96..e587434be86c8bcb66c9166a6780c8a2a7e71a58 100644 (file)
@@ -27,10 +27,9 @@ subdir := csu
 include ../Makeconfig
 
 routines = init-first libc-start $(libc-init) sysdep version check_fds \
-          libc-tls elf-init dso_handle
+          libc-tls dso_handle
 aux     = errno
 elide-routines.os = libc-tls
-static-only-routines = elf-init
 csu-dummies = $(filter-out $(start-installed-name),crt1.o Mcrt1.o)
 extra-objs = start.o \
             $(start-installed-name) g$(start-installed-name) $(csu-dummies) \
@@ -59,13 +58,6 @@ CFLAGS-.os += $(no-stack-protector)
 # but it does not matter for this source file.
 CFLAGS-static-reloc.os += $(stack-protector)
 
-# This file is not actually part of the startup code in the nonshared
-# case and statically linked into applications.  See
-# <https://sourceware.org/bugzilla/show_bug.cgi?id=23323>,
-# <https://sourceware.org/ml/libc-alpha/2018-06/msg00717.html>.
-# Also see the note above regarding STACK_PROTECTOR_LEVEL.
-CFLAGS-elf-init.oS += $(stack-protector)
-
 ifeq (yes,$(build-shared))
 extra-objs += S$(start-installed-name) gmon-start.os
 ifneq ($(start-installed-name),$(static-start-installed-name))
index 43010c344307cea56946387c849d13b4bf7e8f31..8e1b21948e8d7568c3e61caeaeb719cdaf110272 100644 (file)
@@ -7,6 +7,9 @@ libc {
     # New special glibc functions.
     gnu_get_libc_release; gnu_get_libc_version;
   }
+  GLIBC_2.34 {
+    __libc_start_main;
+  }
   GLIBC_PRIVATE {
     errno;
   }
diff --git a/csu/elf-init.c b/csu/elf-init.c
deleted file mode 100644 (file)
index 6e96ab7..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-/* Startup support for ELF initializers/finalizers in the main executable.
-   Copyright (C) 2002-2021 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.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file with other
-   programs, and to distribute those programs without any restriction
-   coming from the use of this file. (The GNU Lesser General Public
-   License restrictions do apply in other respects; for example, they
-   cover modification of the file, and distribution when not linked
-   into another program.)
-
-   Note that people who make modified versions of this file are not
-   obligated to grant this special exception for their modified
-   versions; it is their choice whether to do so. The GNU Lesser
-   General Public License gives permission to release a modified
-   version without this exception; this exception also makes it
-   possible to release a modified version which carries forward this
-   exception.
-
-   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/>.  */
-
-#include <stddef.h>
-#include <elf-initfini.h>
-
-
-/* These magic symbols are provided by the linker.  */
-extern void (*__preinit_array_start []) (int, char **, char **)
-  attribute_hidden;
-extern void (*__preinit_array_end []) (int, char **, char **)
-  attribute_hidden;
-extern void (*__init_array_start []) (int, char **, char **)
-  attribute_hidden;
-extern void (*__init_array_end []) (int, char **, char **)
-  attribute_hidden;
-extern void (*__fini_array_start []) (void) attribute_hidden;
-extern void (*__fini_array_end []) (void) attribute_hidden;
-
-
-#if ELF_INITFINI
-/* These function symbols are provided for the .init/.fini section entry
-   points automagically by the linker.  */
-extern void _init (void);
-extern void _fini (void);
-#endif
-
-
-/* These functions are passed to __libc_start_main by the startup code.
-   These get statically linked into each program.  For dynamically linked
-   programs, this module will come from libc_nonshared.a and differs from
-   the libc.a module in that it doesn't call the preinit array.  */
-
-
-void
-__libc_csu_init (int argc, char **argv, char **envp)
-{
-  /* For dynamically linked executables the preinit array is executed by
-     the dynamic linker (before initializing any shared object).  */
-
-#ifndef LIBC_NONSHARED
-  /* For static executables, preinit happens right before init.  */
-  {
-    const size_t size = __preinit_array_end - __preinit_array_start;
-    size_t i;
-    for (i = 0; i < size; i++)
-      (*__preinit_array_start [i]) (argc, argv, envp);
-  }
-#endif
-
-#if ELF_INITFINI
-  _init ();
-#endif
-
-  const size_t size = __init_array_end - __init_array_start;
-  for (size_t i = 0; i < size; i++)
-      (*__init_array_start [i]) (argc, argv, envp);
-}
-
-/* This function should not be used anymore.  We run the executable's
-   destructor now just like any other.  We cannot remove the function,
-   though.  */
-void
-__libc_csu_fini (void)
-{
-#ifndef LIBC_NONSHARED
-  size_t i = __fini_array_end - __fini_array_start;
-  while (i-- > 0)
-    (*__fini_array_start [i]) ();
-
-# if ELF_INITFINI
-  _fini ();
-# endif
-#endif
-}
index feb0d7ce11ffe2c744ee42407bb03e0ff1c9fb6d..05ff7afddf52f8efab57512f596f1ceb47185b66 100644 (file)
@@ -1,4 +1,5 @@
-/* Copyright (C) 1998-2021 Free Software Foundation, Inc.
+/* Perform initialization and invoke main.
+   Copyright (C) 1998-2021 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
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
+/* Note: This code is only part of the startup code proper for
+   statically linked binaries.  For dynamically linked binaries, it
+   resides in libc.so.  */
+
 /* Mark symbols hidden in static PIE for early self relocation to work.  */
 #if BUILD_PIE_DEFAULT
 # pragma GCC visibility push(hidden)
 #endif
+
 #include <assert.h>
 #include <stdlib.h>
 #include <stdio.h>
@@ -29,6 +35,8 @@
 #include <libc-internal.h>
 #include <elf/libc-early-init.h>
 #include <stdbool.h>
+#include <elf-initfini.h>
+#include <shlib-compat.h>
 
 #include <elf/dl-tunables.h>
 
@@ -95,9 +103,11 @@ apply_irel (void)
 # else
 #  define STATIC static inline __attribute__ ((always_inline))
 # endif
+# define DO_DEFINE_LIBC_START_MAIN_VERSION 0
 #else
 # define STATIC
-# define LIBC_START_MAIN __libc_start_main
+# define LIBC_START_MAIN __libc_start_main_impl
+# define DO_DEFINE_LIBC_START_MAIN_VERSION 1
 #endif
 
 #ifdef MAIN_AUXVEC_ARG
@@ -113,6 +123,92 @@ apply_irel (void)
 # define ARCH_INIT_CPU_FEATURES()
 #endif
 
+#ifdef SHARED
+/* Initialization for dynamic executables.  Find the main executable
+   link map and run its init functions.  */
+static void
+call_init (int argc, char **argv, char **env)
+{
+  /* Obtain the main map of the executable.  */
+  struct link_map *l = GL(dl_ns)[LM_ID_BASE]._ns_loaded;
+
+  /* DT_PREINIT_ARRAY is not processed here.  It is already handled in
+     _dl_init in elf/dl-init.c.  Also see the call_init function in
+     the same file.  */
+
+  if (ELF_INITFINI && l->l_info[DT_INIT] != NULL)
+    DL_CALL_DT_INIT(l, l->l_addr + l->l_info[DT_INIT]->d_un.d_ptr,
+                   argc, argv, env);
+
+  ElfW(Dyn) *init_array = l->l_info[DT_INIT_ARRAY];
+  if (init_array != NULL)
+    {
+      unsigned int jm
+       = l->l_info[DT_INIT_ARRAYSZ]->d_un.d_val / sizeof (ElfW(Addr));
+      ElfW(Addr) *addrs = (void *) (init_array->d_un.d_ptr + l->l_addr);
+      for (unsigned int j = 0; j < jm; ++j)
+       ((dl_init_t) addrs[j]) (argc, argv, env);
+    }
+}
+
+#else /* !SHARED */
+
+/* These magic symbols are provided by the linker.  */
+extern void (*__preinit_array_start []) (int, char **, char **)
+  attribute_hidden;
+extern void (*__preinit_array_end []) (int, char **, char **)
+  attribute_hidden;
+extern void (*__init_array_start []) (int, char **, char **)
+  attribute_hidden;
+extern void (*__init_array_end []) (int, char **, char **)
+  attribute_hidden;
+extern void (*__fini_array_start []) (void) attribute_hidden;
+extern void (*__fini_array_end []) (void) attribute_hidden;
+
+# if ELF_INITFINI
+/* These function symbols are provided for the .init/.fini section entry
+   points automagically by the linker.  */
+extern void _init (void);
+extern void _fini (void);
+# endif
+
+/* Initialization for static executables.  There is no dynamic
+   segment, so we access the symbols directly.  */
+static void
+call_init (int argc, char **argv, char **envp)
+{
+  /* For static executables, preinit happens right before init.  */
+  {
+    const size_t size = __preinit_array_end - __preinit_array_start;
+    size_t i;
+    for (i = 0; i < size; i++)
+      (*__preinit_array_start [i]) (argc, argv, envp);
+  }
+
+# if ELF_INITFINI
+  _init ();
+# endif
+
+  const size_t size = __init_array_end - __init_array_start;
+  for (size_t i = 0; i < size; i++)
+      (*__init_array_start [i]) (argc, argv, envp);
+}
+
+/* Likewise for the destructor.  */
+static void
+call_fini (void *unused)
+{
+  size_t i = __fini_array_end - __fini_array_start;
+  while (i-- > 0)
+    (*__fini_array_start [i]) ();
+
+# if ELF_INITFINI
+  _fini ();
+# endif
+}
+
+#endif /* !SHARED */
+
 #include <libc-start.h>
 
 STATIC int LIBC_START_MAIN (int (*main) (int, char **, char **
@@ -129,9 +225,16 @@ STATIC int LIBC_START_MAIN (int (*main) (int, char **, char **
      __attribute__ ((noreturn));
 
 
-/* Note: the fini parameter is ignored here for shared library.  It
-   is registered with __cxa_atexit.  This had the disadvantage that
-   finalizers were called in more than one place.  */
+/* Note: The init and fini parameters are no longer used.  fini is
+   completely unused, init is still called if not NULL, but the
+   current startup code always passes NULL.  (In the future, it would
+   be possible to use fini to pass a version code if init is NULL, to
+   indicate the link-time glibc without introducing a hard
+   incompatibility for new programs with older glibc versions.)
+
+   For dynamically linked executables, the dynamic segment is used to
+   locate constructors and destructors.  For statically linked
+   executables, the relevant symbols are access directly.  */
 STATIC int
 LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
                 int argc, char **argv,
@@ -258,9 +361,8 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
      run the constructors in `_dl_start_user'.  */
   __libc_init_first (argc, argv, __environ);
 
-  /* Register the destructor of the program, if any.  */
-  if (fini)
-    __cxa_atexit ((void (*) (void *)) fini, NULL, NULL);
+  /* Register the destructor of the statically-linked program.  */
+  __cxa_atexit (call_fini, NULL, NULL);
 
   /* Some security at this point.  Prevent starting a SUID binary where
      the standard file descriptors are not opened.  We have to do this
@@ -268,15 +370,24 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
      loader did the work already.  */
   if (__builtin_expect (__libc_enable_secure, 0))
     __libc_check_standard_fds ();
-#endif
+#endif /* !SHARED */
 
   /* Call the initializer of the program, if any.  */
 #ifdef SHARED
   if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
     GLRO(dl_debug_printf) ("\ninitialize program: %s\n\n", argv[0]);
-#endif
-  if (init)
+
+  if (init != NULL)
+    /* This is a legacy program which supplied its own init
+       routine.  */
     (*init) (argc, argv, __environ MAIN_AUXVEC_PARAM);
+  else
+    /* This is a current program.  Use the dynamic segment to find
+       constructors.  */
+    call_init (argc, argv, __environ);
+#else /* !SHARED */
+  call_init (argc, argv, __environ);
+#endif /* SHARED */
 
 #ifdef SHARED
   /* Auditing checkpoint: we have a new object.  */
@@ -365,3 +476,36 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
 
   exit (result);
 }
+
+/* Starting with glibc 2.34, the init parameter is always NULL.  Older
+   libcs are not prepared to handle that.  The macro
+   DEFINE_LIBC_START_MAIN_VERSION creates GLIBC_2.34 alias, so that
+   newly linked binaries reflect that dependency.  The macros below
+   expect that the exported function is called
+   __libc_start_main_impl.  */
+#ifdef SHARED
+# define DEFINE_LIBC_START_MAIN_VERSION \
+  DEFINE_LIBC_START_MAIN_VERSION_1 \
+  strong_alias (__libc_start_main_impl, __libc_start_main_alias_2)     \
+  versioned_symbol (libc, __libc_start_main_alias_2, __libc_start_main, \
+                   GLIBC_2_34);
+
+# if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_34)
+#  define DEFINE_LIBC_START_MAIN_VERSION_1 \
+  strong_alias (__libc_start_main_impl, __libc_start_main_alias_1)     \
+  compat_symbol (libc, __libc_start_main_alias_1, __libc_start_main, GLIBC_2_0);
+#  else
+#  define DEFINE_LIBC_START_MAIN_VERSION_1
+# endif
+#else  /* !SHARED */
+/* Enable calling the function under its exported name.  */
+# define DEFINE_LIBC_START_MAIN_VERSION \
+  strong_alias (__libc_start_main_impl, __libc_start_main)
+#endif
+
+/* Only define the version information if LIBC_START_MAIN was not set.
+   If there is a wrapper file, it must expand
+   DEFINE_LIBC_START_MAIN_VERSION on its own.  */
+#if DO_DEFINE_LIBC_START_MAIN_VERSION
+DEFINE_LIBC_START_MAIN_VERSION
+#endif
index b7e4b8a3afc43a8a126de47102ce7862346d5df1..f924d26642d5357b8c59edbf60691cbdaa69b98b 100644 (file)
 #include <elf-initfini.h>
 
 
-/* Type of the initializer.  */
-typedef void (*init_t) (int, char **, char **);
-
-
 static void
 call_init (struct link_map *l, int argc, char **argv, char **env)
 {
@@ -71,7 +67,7 @@ call_init (struct link_map *l, int argc, char **argv, char **env)
 
       addrs = (ElfW(Addr) *) (init_array->d_un.d_ptr + l->l_addr);
       for (j = 0; j < jm; ++j)
-       ((init_t) addrs[j]) (argc, argv, env);
+       ((dl_init_t) addrs[j]) (argc, argv, env);
     }
 }
 
@@ -103,7 +99,7 @@ _dl_init (struct link_map *main_map, int argc, char **argv, char **env)
 
       addrs = (ElfW(Addr) *) (preinit_array->d_un.d_ptr + main_map->l_addr);
       for (cnt = 0; cnt < i; ++cnt)
-       ((init_t) addrs[cnt]) (argc, argv, env);
+       ((dl_init_t) addrs[cnt]) (argc, argv, env);
     }
 
   /* Stupid users forced the ELF specification to be changed.  It now
index 3761cbd7ee0f0bffcc5848a5df1324835dbfbe7b..417da8802b9ed52a536d8da697b7edf3d306da7d 100644 (file)
@@ -63,26 +63,16 @@ ENTRY(_start)
 # ifdef SHARED
         adrp    x0, :got:main
        ldr     PTR_REG (0), [x0, #:got_lo12:main]
-
-        adrp    x3, :got:__libc_csu_init
-       ldr     PTR_REG (3), [x3, #:got_lo12:__libc_csu_init]
-
-        adrp    x4, :got:__libc_csu_fini
-       ldr     PTR_REG (4), [x4, #:got_lo12:__libc_csu_fini]
 # else
        adrp    x0, __wrap_main
        add     x0, x0, :lo12:__wrap_main
-       adrp    x3, __libc_csu_init
-       add     x3, x3, :lo12:__libc_csu_init
-       adrp    x4, __libc_csu_fini
-       add     x4, x4, :lo12:__libc_csu_fini
 # endif
 #else
        /* Set up the other arguments in registers */
        MOVL (0, main)
-       MOVL (3, __libc_csu_init)
-       MOVL (4, __libc_csu_fini)
 #endif
+       mov     x3, #0          /* Used to be init.  */
+       mov     x4, #0          /* Used to be fini.  */
 
        /* __libc_start_main (main, argc, argv, init, fini, rtld_fini,
                              stack_end) */
index f3eb2029e1b97b341ba537dd9bae5b3f96f65ceb..65dcd4d39279749ecaaf99af47399698e65c5447 100644 (file)
@@ -55,9 +55,8 @@ _start:
        ldl     a1, 16(sp)      /* get argc */
        lda     a2, 24(sp)      /* get argv */
 
-  /* Load address of our own entry points to .fini and .init.  */
-       lda     a3, __libc_csu_init
-       lda     a4, __libc_csu_fini
+       mov     $r31, a3        /* Used to be init.  */
+       mov     $r31, a4        /* Used to be fini.  */
 
   /* Store address of the shared library termination function.  */
        mov     v0, a5
index dbec87e6bb782f3c34f5f34d15a0ec1c9f17328e..5302a57cab8b2e46c740cca2690463a147c38c60 100644 (file)
@@ -49,15 +49,14 @@ ENTRY (ENTRY_POINT)
 
        /* __libc_start_main (main, argc, argv, init, fini, rtld_fini, stack_end).  */
 
+       mov_s   r3, 0           /* Used to be init.  */
+       mov     r4, 0           /* Used to be fini.  */
+
 #ifdef SHARED
        ld      r0, [pcl, @main@gotpc]
-       ld      r3, [pcl, @__libc_csu_init@gotpc]
-       ld      r4, [pcl, @__libc_csu_fini@gotpc]
        bl      __libc_start_main@plt
 #else
        mov_s   r0, main
-       mov_s   r3, __libc_csu_init
-       mov     r4, __libc_csu_fini
        bl      __libc_start_main
 #endif
 
index 30f69e1b076d583747548568f3fcb651752b7e82..9b56bc0cca0d3dc1b73520826434145baac2abab 100644 (file)
@@ -94,30 +94,20 @@ _start:
        adr a4, .L_GOT
        add sl, sl, a4
 
-       ldr ip, .L_GOT+4        /* __libc_csu_fini */
-       ldr ip, [sl, ip]
+       mov a4, #0              /* Used to be init.  */
+       push { a4 }             /* Used to be fini.  */
 
-       push { ip }             /* Push __libc_csu_fini */
-
-       ldr a4, .L_GOT+8        /* __libc_csu_init */
-       ldr a4, [sl, a4]
-
-       ldr a1, .L_GOT+12       /* main */
+       ldr a1, .L_GOT+4        /* main */
        ldr a1, [sl, a1]
 
        /* __libc_start_main (main, argc, argv, init, fini, rtld_fini, stack_end) */
        /* Let the libc call main and exit with its return code.  */
        bl __libc_start_main(PLT)
 #else
-       /* Fetch address of __libc_csu_fini */
-       ldr ip, =__libc_csu_fini
-
-       /* Push __libc_csu_fini */
-       push { ip }
 
-       /* Set up the other arguments in registers */
+       mov a4, #0              /* Used to init.  */
+       push { a4 }             /* Used to fini.  */
        ldr a1, =main
-       ldr a4, =__libc_csu_init
 
        /* __libc_start_main (main, argc, argv, init, fini, rtld_fini, stack_end) */
        /* Let the libc call main and exit with its return code.  */
@@ -131,8 +121,6 @@ _start:
        .align 2
 .L_GOT:
        .word _GLOBAL_OFFSET_TABLE_ - .L_GOT
-       .word __libc_csu_fini(GOT)
-       .word __libc_csu_init(GOT)
        .word main(GOT)
 #endif
 
index d65e37e61b0e014f66b3e8f59de9f41a985513fa..a565cfa87b5f45c413fb93e525d00ec1d0707b52 100644 (file)
@@ -66,13 +66,9 @@ _start:
 .Lgetpc:
        lrw     gb, .Lgetpc@GOTPC
        addu    gb, t0
-       lrw     a3, __libc_csu_fini@GOT
-       ldr.w   a3, (gb, a3 << 0)
-       stw     a3, (sp, 0)
 
-       lrw     a3, __libc_csu_init@GOT
-       addu    a3, gb
-       ldw     a3, (a3, 0)
+       movi    a3, 0           /* Used to be init.  */
+       stw     a3, (sp, 0)     /* Used to be fini.  */
 
        lrw     t0, main@GOT
        addu    t0, gb
@@ -85,14 +81,9 @@ _start:
        ldr.w   t1, (gb, t1 << 0)
        jsr     t1
 #else
-       /* Fetch address of __libc_csu_fini.  */
-       lrw     a0, __libc_csu_fini
-       /* Push __libc_csu_fini */
-       stw     a0, (sp, 0)
-
-       /* Set up the other arguments in registers.  */
+       movi    a3, 0           /* Used to be init.  */
+       stw     a3, (sp, 0)     /* Used to be fini.  */
        lrw     a0, main
-       lrw     a3, __libc_csu_init
        /* Let the libc call main and exit with its return code.  */
        jsri    __libc_start_main
 
index 9720a4e4467ecaeb2d1d2643f9690d8b5c2e6459..ea3f7a69d05cb78bd8677f552025d68abb065b65 100644 (file)
@@ -93,6 +93,10 @@ typedef struct link_map *lookup_t;
    : (__glibc_unlikely ((ref)->st_shndx == SHN_ABS) ? 0                        \
       : LOOKUP_VALUE_ADDRESS (map, map_set)) + (ref)->st_value)
 
+/* Type of a constructor function, in DT_INIT, DT_INIT_ARRAY,
+   DT_PREINIT_ARRAY.  */
+typedef void (*dl_init_t) (int, char **, char **);
+
 /* On some architectures a pointer to a function is not just a pointer
    to the actual code of the function but rather an architecture
    specific descriptor. */
@@ -101,7 +105,7 @@ typedef struct link_map *lookup_t;
  (void *) SYMBOL_ADDRESS (map, ref, false)
 # define DL_LOOKUP_ADDRESS(addr) ((ElfW(Addr)) (addr))
 # define DL_CALL_DT_INIT(map, start, argc, argv, env) \
- ((init_t) (start)) (argc, argv, env)
+ ((dl_init_t) (start)) (argc, argv, env)
 # define DL_CALL_DT_FINI(map, start) ((fini_t) (start)) ()
 #endif
 
index 29d994bfc264053d1d4e204c07ae1301f6d0423f..a9a927f26c6fec09f884ae4a57e40f658f2cbf6a 100644 (file)
@@ -56,7 +56,7 @@ void attribute_hidden _dl_unmap (struct link_map *map);
 {                                                      \
   ElfW(Addr) addr;                                     \
   DL_DT_FUNCTION_ADDRESS(map, start, , addr)           \
-  init_t init = (init_t) addr;                                 \
+  dl_init_t init = (dl_init_t) addr;                   \
   init (argc, argv, env);                              \
 }
 
index 2fe73c9aaee01c0549f894dfccd78fe25ab632c9..4a1877f8e8b4dfec5ce7bcf09cc1f9afc91e6ba3 100644 (file)
@@ -36,8 +36,6 @@
        .import main, code
        .import $global$, data
        .import __libc_start_main, code
-       .import __libc_csu_fini, code
-       .import __libc_csu_init, code
 
        /* Have the linker create plabel words so we get PLABEL32
           relocs and not 21/14.  The use of 21/14 relocs is only
        .word P%main
 .Lp__libc_start_main:
        .word P%__libc_start_main
-.Lp__libc_csu_fini:
-       .word P%__libc_csu_fini
-.Lp__libc_csu_init:
-       .word P%__libc_csu_init
 
        .text
        .align 4
@@ -77,8 +71,8 @@ _start:
                1. r26 - Application main
                2. r25 - argc
                3. r24 - argv
-               4. r23 - __libc_csu_init
-               5. sp-52 - __libc_csu_fini
+               4. r23 - init (unused)
+               5. sp-52 - fini (unused)
                6. sp-56 - rtld_fini
                7. sp-60 - stackend  */
 
@@ -108,14 +102,6 @@ _start:
        addil   LT'.Lpmain, %r19
        ldw     RT'.Lpmain(%r1), %r26
        ldw     0(%r26),%r26
-       /* void (*init) (void) (4th argument) */
-       addil   LT'.Lp__libc_csu_init, %r19
-       ldw     RT'.Lp__libc_csu_init(%r1), %r23
-       ldw     0(%r23), %r23
-       /* void (*fini) (void) (5th argument) */
-       addil   LT'.Lp__libc_csu_fini, %r19
-       ldw     RT'.Lp__libc_csu_fini(%r1), %r22
-       ldw     0(%r22), %r22
 #else
        /* Load $global$ address into %dp */
        ldil    L%$global$, %dp
@@ -124,13 +110,9 @@ _start:
        /* load main (1st argument) */
        ldil    LR'.Lpmain, %r26
        ldw     RR'.Lpmain(%r26), %r26
-       /* void (*init) (void) (4th argument) */
-       ldil    LR'.Lp__libc_csu_init, %r23
-       ldw     RR'.Lp__libc_csu_init(%r23), %r23
-       /* void (*fini) (void) (5th argument) */
-       ldil    LR'.Lp__libc_csu_fini, %r22
-       ldw     RR'.Lp__libc_csu_fini(%r22), %r22
 #endif
+       ldi     0,%r23          /* Used to be init.  */
+       ldi     0,%r22          /* Used to be fini.  */
        /* Store 5th argument */
        stw     %r22, -52(%sp)
        /* void *stack_end (7th argument) */
index 24c806cfecdd17ed8c1dfc0532708291de1c4b0f..5296b27e651bd647ae06ea1b9abeade46112c5f2 100644 (file)
@@ -87,11 +87,9 @@ ENTRY (_start)
        call 1f
        addl $_GLOBAL_OFFSET_TABLE_, %ebx
 
-       /* Push address of our own entry points to .fini and .init.  */
-       leal __libc_csu_fini@GOTOFF(%ebx), %eax
-       pushl %eax
-       leal __libc_csu_init@GOTOFF(%ebx), %eax
-       pushl %eax
+       /* This used to be the addresses of .fini and .init.  */
+       pushl $0
+       pushl $0
 
        pushl %ecx              /* Push second argument: argv.  */
        pushl %esi              /* Push first argument: argc.  */
@@ -112,9 +110,9 @@ ENTRY (_start)
           But let the libc call main.    */
        call __libc_start_main@PLT
 #else
-       /* Push address of our own entry points to .fini and .init.  */
-       pushl $__libc_csu_fini
-       pushl $__libc_csu_init
+       /* This used to be the addresses of .fini and .init.  */
+       pushl $0
+       pushl $0
 
        pushl %ecx              /* Push second argument: argv.  */
        pushl %esi              /* Push first argument: argc.  */
index 209d926bad6db9ca6fee1329b160267e6efdcaae..58ca32424b08aaf41e074f3d8af6d36d4a5c9c05 100644 (file)
@@ -50,7 +50,7 @@ extern void attribute_hidden _dl_unmap (struct link_map *map);
 {                                                      \
   ElfW(Addr) addr;                                     \
   DL_DT_FUNCTION_ADDRESS(map, start, , addr)           \
-  init_t init = (init_t) addr;                                 \
+  dl_init_t init = (dl_init_t) addr;                   \
   init (argc, argv, env);                              \
 }
 
index 0018acc8218b2d84c13c382c6c3792e2353fe204..b28f8cb42967f4790cfedeaf3f4eded2fa345d1a 100644 (file)
@@ -82,20 +82,15 @@ _start:
        {
          addl r11 = @ltoff(__libc_ia64_register_backing_store_base), gp
          addl out0 = @ltoff(@fptr(main)), gp
-         addl out3 = @ltoff(@fptr(__libc_csu_init)), gp
+         mov out3 = r0         /* Used to be init.  */
          ;;
        }
        { .mmi
          ld8 r3 = [r11]        /* pointer to __libc_ia64_register_backing_store_base */
          ld8 out0 = [out0]     /* pointer to `main' function descriptor */
-         addl out4 = @ltoff(@fptr(__libc_csu_fini)), gp
+         mov out4 = r0         /* Used to be fini.  */
          ;;
        }
-       { .mmi
-         ld8 out3 = [out3]     /* pointer to `init' function descriptor */
-         ld8 out4 = [out4]     /* pointer to `fini' function descriptor */
-         nop 0
-       }
        .body
        { .mib
          st8 [r3] = r10
index c36b34f8d95e58e1214dca7ca41e4f25eb83d6ab..98da4db9f3d613f5a929e60344b46512c42b7d13 100644 (file)
@@ -76,15 +76,14 @@ _start:
        pea (%a1)               /* Push address of the shared library
                                   termination function.  */
 
+       /* These used to be addresses of the .fini and .init entry points.  */
+       clr.l -(%sp)
+       clr.l -(%sp)
+
 #ifdef PIC
        /* Load PIC register.  */
        LOAD_GOT (%a5)
 
-       /* Push the address of our own entry points to `.fini' and
-          `.init'.  */
-       move.l __libc_csu_fini@GOT(%a5), -(%sp)
-       move.l __libc_csu_init@GOT(%a5), -(%sp)
-
        pea (%a0)               /* Push second argument: argv.  */
        move.l %d0, -(%sp)      /* Push first argument: argc.  */
 
@@ -94,10 +93,6 @@ _start:
           let the libc call main.  */
        jbsr __libc_start_main@PLTPC
 #else
-       /* Push the address of our own entry points to `.fini' and
-          `.init'.  */
-       pea __libc_csu_fini
-       pea __libc_csu_init
 
        pea (%a0)               /* Push second argument: argv.  */
        move.l %d0, -(%sp)      /* Push first argument: argc.  */
index 509e9b7cb083cb4610d573f55bf2b2cbb731e8ab..e10a286d2ef894d1b88e9081e2f3a26468e30e25 100644 (file)
@@ -2203,6 +2203,7 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index dcb202a63b543a12b4646440ced9d40c35ceeca1..6589bd4dc74eda1d46a4dbe4f6d0fd8fc3cb4cf4 100644 (file)
@@ -63,14 +63,14 @@ _start:
     mfs     r20,rpc
     addik   r20,r20,_GLOBAL_OFFSET_TABLE_+8
     lwi     r5,r20,main@GOT
-    lwi     r8,r20,__libc_csu_init@GOT
-    lwi     r9,r20,__libc_csu_fini@GOT
+    addk    r8,r0,r0           /* Used to be init.  */
+    addk    r9,r0,r0           /* Used to be fini.  */
     brid    __libc_start_main@PLT
     addk    r10,r0,r0
 #else
     addik   r5,r0,main
-    addik   r8,r0,__libc_csu_init
-    addik   r9,r0,__libc_csu_fini
+    addk    r8,r0,r0           /* Used to be init.  */
+    addk    r9,r0,r0           /* Used to be fini.  */
     brid    __libc_start_main
     addk    r10,r0,r0
 #endif
index 28e2ed17adf61891a4d39d7ebdbae41dfc592b6a..4ec42a2a7fb0b7af4780f68c8a19fc9ac337e752 100644 (file)
@@ -96,13 +96,13 @@ ENTRY_POINT:
 # if _MIPS_SIM == _ABIO32
        PTR_SUBIU $29, 32
 # endif
-       PTR_LA $7, __libc_csu_init              /* init */
-       PTR_LA $8, __libc_csu_fini
+       move  $7, $0                    /* Used to be init.  */
 # if _MIPS_SIM == _ABIO32
-       PTR_S $8, 16($29)               /* fini */
+       PTR_S $0, 16($29)               /* Used to be fini.  */
        PTR_S $2, 20($29)               /* rtld_fini */
        PTR_S $29, 24($29)              /* stack_end */
 # else
+       move $8, $0             /* Used to be fini.  */
        move $9, $2             /* rtld_fini */
        move $10, $29           /* stack_end */
 # endif
@@ -143,19 +143,17 @@ ENTRY_POINT:
        /* Lay out last arguments, and call __libc_start_main().  */
 # ifdef __PIC__
        sw      $7, 24($sp)                     /* stack_end */
-       lw      $4, %got(__libc_csu_fini)($3)
-       lw      $7, %got(__libc_csu_init)($3)   /* init */
-       sw      $4, 16($sp)                     /* fini */
+       move    $4, $0                          /* Used to be ini.  */
+       sw      $0, 16($sp)                     /* Used to be fini.  */
        lw      $4, %got(main)($3)              /* main */
        lw      $3, %call16(__libc_start_main)($3)
        sw      $2, 20($sp)                     /* rtld_fini */
        move    $25, $3
        jalr    $3
 # else
-       lw      $4, 1f
        sw      $7, 24($sp)                     /* stack_end */
-       lw      $7, 2f                          /* init */
-       sw      $4, 16($sp)                     /* fini */
+       move    $7, $0                          /* Used to be init.  */
+       sw      $0, 16($sp)                     /* Used to be fini.  */
        lw      $4, 3f                          /* main */
        sw      $2, 20($sp)                     /* rtld_fini */
        /* Load and call __libc_start_main().  */
@@ -165,8 +163,6 @@ ENTRY_POINT:
 hlt:   b       hlt             /* Crash if somehow it does return.  */
 # ifndef __PIC__
        .align  2
-1:     .word   __libc_csu_fini
-2:     .word   __libc_csu_init
 3:     .word   main
 4:     .word   __libc_start_main
 # endif
index 0a6c587de34ee9a02d424b27463f61daf29fd227..7c9696977f64f44d41f6003a968c6347b4da21b3 100644 (file)
@@ -92,18 +92,11 @@ _start:
        addi    r2, r2, %lo(_gp_got - 1b)
        add     r22, r22, r2
 
-       /* Push fini */
-       movhi   r8, %call_hiadj(__libc_csu_fini)
-       addi    r8, r8, %call_lo(__libc_csu_fini)
-       add     r8, r8, r22
-       ldw     r8, 0(r8)
-       stw     r8, 0(sp)
-
-       /* r7 == init */
-       movhi   r7, %call_hiadj(__libc_csu_init)
-       addi    r7, r7, %call_lo(__libc_csu_init)
-       add     r7, r7, r22
-       ldw     r7, 0(r7)
+       /* Used to be fini.  */
+       stw     zero, 0(sp)
+
+       /* Used to be init.  */
+       mov     r7, zero
 
        /* r6 == argv */
        addi    r6, sp, 16
index a721a18775d93e7c67baddb2182eaaa6e217babb..39ce1a18ff6fe19cf0f5c0d8344f46cbb1fff998 100644 (file)
@@ -52,8 +52,8 @@
 L(start_addresses):
        .long   _SDA_BASE_
        .long   main
-       .long   __libc_csu_init
-       .long   __libc_csu_fini
+       .long   0 /* Used to be init.  */
+       .long   0 /* Used to be fini.  */
        ASM_SIZE_DIRECTIVE(L(start_addresses))
 
        .section ".text"
index 612c846632ea92bc9ddf592bb60605b7c3bc5dc2..71c0c67926754501109f47c119d67bfae4dd8a7d 100644 (file)
@@ -53,8 +53,8 @@ L(start_addresses):
        .quad   0 /* was _SDA_BASE_  but not in 64-bit ABI*/
 /*     function descriptors so don't need JUMPTARGET */
        .quad   main
-       .quad   __libc_csu_init
-       .quad   __libc_csu_fini
+       .quad   0 /* Used to be init.  */
+       .quad   0 /* Used to be fini.  */
 
        ASM_SIZE_DIRECTIVE(L(start_addresses))
 
index 9c9403501538d3ddde1e5ec8775818af0c3b35b9..806f6aacd6174679cbd45840921367d2da71836c 100644 (file)
@@ -54,8 +54,8 @@ ENTRY (ENTRY_POINT)
        REG_L a1, 0(sp)      /* argc.  */
        addi  a2, sp, SZREG  /* argv.  */
        andi  sp, sp, ALMASK /* Align stack. */
-       lla   a3, __libc_csu_init
-       lla   a4, __libc_csu_fini
+       li    a3, 0          /* Used to be init.  */
+       li    a4, 0          /* Used to be fini.  */
        mv    a6, sp  /* stack_end.  */
 
        call  __libc_start_main@plt
index aba90739c1f9f9f474991ee0142955c9355d2ac3..b6cfa4caf375eefeae8edfaf01b1230d9c679192 100644 (file)
@@ -175,18 +175,16 @@ _start:
         */
        stm     %r14,%r15,96(%r15)      # store rtld_fini/stack_end to parameter area
        la      %r7,96(%r15)
-       l       %r6,.L2-.Llit(%r13)     # load pointer to __libc_csu_fini
-       l       %r5,.L1-.Llit(%r13)     # load pointer to __libc_csu_init
        l       %r2,.L3-.Llit(%r13)     # load pointer to main
        l       %r1,.L4-.Llit(%r13)     # load pointer to __libc_start_main
 #ifdef PIC
        l       %r12,.L5-.Llit(%r13)    # load .got pointer
-       la      %r6,0(%r13,%r6)
-       la      %r5,0(%r13,%r5)
        la      %r12,0(%r13,%r12)
        l       %r2,0(%r12,%r2)
        la      %r1,0(%r13,%r1)
 #endif
+       lhi     %r6, 0                  # Used to fini.
+       lhi     %r5, 0                  # Used to init.
 
        /* ok, now branch to the libc main routine */
        basr    %r14,%r1
@@ -197,13 +195,9 @@ _start:
        cfi_endproc
 .Llit:
 #ifndef PIC
-.L1:    .long  __libc_csu_init
-.L2:    .long  __libc_csu_fini
 .L3:    .long  main
 .L4:    .long  __libc_start_main
 #else
-.L1:    .long  __libc_csu_init-.Llit
-.L2:    .long  __libc_csu_fini-.Llit
 .L3:    .long  main@GOT
 .L4:    .long  __libc_start_main@plt-.Llit
 .L5:    .long  _GLOBAL_OFFSET_TABLE_-.Llit
index 0d9d30916d1dbddfc9c88386cd95ad546b561ea6..4e6526308aee3c006ac654b7dae379769013bb98 100644 (file)
@@ -80,8 +80,8 @@ _start:
         */
        stmg    %r14,%r15,160(%r15)     # store rtld_fini/stack_end to parameter area
        la      %r7,160(%r15)
-       larl    %r6,__libc_csu_fini     # load pointer to __libc_csu_fini
-       larl    %r5,__libc_csu_init     # load pointer to __libc_csu_init
+       lghi    %r6,0                   # Used to be fini.
+       lghi    %r5,0                   # Used to be init.
 
        /* Ok, now branch to the libc main routine.  */
 #ifdef PIC
index ab29f194f708fbbb20bb1b0a2bd7e66444851aa4..606ee592222adca9c5d785810bb64ee093462c03 100644 (file)
@@ -70,12 +70,11 @@ _start:
 
        /* Push the last arguments to main() onto the stack */
        mov.l r4,@-r15
-       mov.l L_fini,r0
-       mov.l r0,@-r15
+       mov.l r14,@-r15         /* Used to be fini.  */
 
        /* Set up the other arguments for main() that go in registers */
        mov.l L_main,r4
-       mov.l L_init,r7
+       mov #0,r7               /* Used to be init.  */
 
        /* __libc_start_main (main, argc, argv, init, fini, rtld_fini) */
 
@@ -90,10 +89,6 @@ _start:
        .align  2
 L_main:
        .long   main
-L_init:
-       .long   __libc_csu_init
-L_fini:
-       .long   __libc_csu_fini
 L_libc_start_main:
        .long   __libc_start_main
 L_abort:
index 45ca77da3e9065fb339dbc5821d8fa59413517d7..00bf898fb953df82e502ca6010aa9fd603370bdd 100644 (file)
@@ -59,22 +59,14 @@ _start:
   /* Load the addresses of the user entry points.  */
 #ifndef PIC
        sethi   %hi(main), %o0
-       sethi   %hi(__libc_csu_init), %o3
-       sethi   %hi(__libc_csu_fini), %o4
        or      %o0, %lo(main), %o0
-       or      %o3, %lo(__libc_csu_init), %o3
-       or      %o4, %lo(__libc_csu_fini), %o4
 #else
        sethi   %gdop_hix22(main), %o0
-       sethi   %gdop_hix22(__libc_csu_init), %o3
-       sethi   %gdop_hix22(__libc_csu_fini), %o4
        xor     %o0, %gdop_lox10(main), %o0
-       xor     %o3, %gdop_lox10(__libc_csu_init), %o3
-       xor     %o4, %gdop_lox10(__libc_csu_fini), %o4
        ld      [%l7 + %o0], %o0, %gdop(main)
-       ld      [%l7 + %o3], %o3, %gdop(__libc_csu_init)
-       ld      [%l7 + %o4], %o4, %gdop(__libc_csu_fini)
 #endif
+       mov     0, %o3          /* Used to be init.  */
+       mov     0, %o4          /* Used to be fini.  */
 
   /* When starting a binary via the dynamic linker, %g1 contains the
      address of the shared library termination function, which will be
index 210fbaff90463d165e1e1cec2b17a13c413df816..8520717eba2438ecc5e8c1bb44e9e58d242fda5a 100644 (file)
@@ -60,22 +60,14 @@ _start:
   /* Load the addresses of the user entry points.  */
 #ifndef PIC
        sethi   %hi(main), %o0
-       sethi   %hi(__libc_csu_init), %o3
-       sethi   %hi(__libc_csu_fini), %o4
        or      %o0, %lo(main), %o0
-       or      %o3, %lo(__libc_csu_init), %o3
-       or      %o4, %lo(__libc_csu_fini), %o4
 #else
        sethi   %gdop_hix22(main), %o0
-       sethi   %gdop_hix22(__libc_csu_init), %o3
-       sethi   %gdop_hix22(__libc_csu_fini), %o4
        xor     %o0, %gdop_lox10(main), %o0
-       xor     %o3, %gdop_lox10(__libc_csu_init), %o3
-       xor     %o4, %gdop_lox10(__libc_csu_fini), %o4
        ldx     [%l7 + %o0], %o0, %gdop(main)
-       ldx     [%l7 + %o3], %o3, %gdop(__libc_csu_init)
-       ldx     [%l7 + %o4], %o4, %gdop(__libc_csu_fini)
 #endif
+       mov     0, %o3          /* Used to be init.  */
+       mov     0, %o4          /* Used to be fini.  */
 
   /* When starting a binary via the dynamic linker, %g1 contains the
      address of the shared library termination function, which will be
index 4cc1c6a5918835e7f06d6012d51cd74c3ec88f06..bac795262ddef6b91f8ab800a0db2fbbc549fb69 100644 (file)
@@ -2171,3 +2171,4 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
index 26ad9845e418bdc0f31a282cc699d48f89ed1cda..897f70db2218f7ebb7fc11f6011185f0a8b5ca65 100644 (file)
@@ -2253,6 +2253,7 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
index bb9dfd4daf6748ecea3f2012ecaa2c0c9acfad44..604d259ad6854482be6e57db05b4b28361a91145 100644 (file)
@@ -1931,3 +1931,4 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
index 3b0a47e967c81e6174a9cb7c7dd238e068e59d87..094236f7134cb9a461d3426fe7d47810f4d843b1 100644 (file)
@@ -155,6 +155,7 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
 GLIBC_2.4 _Exit F
 GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
 GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
index 9ab3924888170a64855b2313b4b954f4afacbaf9..2bb4d31e81fa6905f1e0f08e2c552a474d6a9853 100644 (file)
@@ -152,6 +152,7 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
 GLIBC_2.4 _Exit F
 GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
 GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
index 14a84dac8fbbfae750b6f8e7883cec9308a7b821..d4291fecfbfa84b2e31551ec4f373fe1735c3f14 100644 (file)
@@ -2115,3 +2115,4 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
index 5c8502f3d3b7ca1b99fecdd0a4e03ccd4bdb1244..1fd2a862f68b7eb7d5827e61c8a39826b802b8bb 100644 (file)
@@ -2074,6 +2074,7 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index ddc583705900aa59298092c07d07221f44c3b9a8..943331f01eb0be93b1c26c75be927aea069b9a9d 100644 (file)
@@ -2241,6 +2241,7 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index e3b345b803c59e5b0ea314c9acd7f1254ea18122..f530151bde07206a75f9c56cec58ddb93b2f30fd 100644 (file)
@@ -2106,6 +2106,7 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index 25f2d1c08f2cac6341bf4811edd373fe19a5a62c..6e76b6dcaad8a09811c952af8470879b3e71086d 100644 (file)
@@ -156,6 +156,7 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
 GLIBC_2.4 _Exit F
 GLIBC_2.4 _IO_2_1_stderr_ D 0x98
 GLIBC_2.4 _IO_2_1_stdin_ D 0x98
index c4891479d36d7f2d8bc3518a0a32a91cdfb41fd5..7541b8289f4021827fee2ff6731586ae37a3823a 100644 (file)
@@ -2186,6 +2186,7 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index 143b0163b4a93b747662b5393680d38f31e296dc..6cf1936c42a8ae179c2ad17e1d2ccbcffd040b36 100644 (file)
@@ -2166,3 +2166,4 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
index 13d374a031ebfac58a4788e7c784ccd1d8661ef1..98730ebcdad68c4f2df69626e0e7d156ec52912b 100644 (file)
@@ -2163,3 +2163,4 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
index b2295f193786e7bfa6dfd17d6444028f0ded3132..92fa6cbc7369f0d72be651e3600698d29a5fc560 100644 (file)
@@ -2157,6 +2157,7 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index 4c786070d05fac87cca7b615fac3d6d6c154a799..265a49e74ebb39e7b2520304ae90039646638e6c 100644 (file)
@@ -2155,6 +2155,7 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index aa9c6a4dcafe1a8d0afb10b9089bf91185274cce..cfa5e1111ba979dee725e2d73eff75d4034101bd 100644 (file)
@@ -2163,6 +2163,7 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index 5939588ad5980e0558500aae9a86703786dba0e3..8c03ac52cd028749d0ae588e36c2ae2c5f2eee4e 100644 (file)
@@ -2157,6 +2157,7 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index 92556c42373e3f41df27c2757fc5b7c9fe48140b..17f5609e067a1ca01e5b63b35301043c3cea9295 100644 (file)
@@ -2204,3 +2204,4 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
index 66f5effe8a63da0d21add4f5176609f3e0e9f18b..4d681dad0669604d4a13a6aef0494d1067a2c264 100644 (file)
@@ -41,12 +41,12 @@ struct startup_info
   };
 
 int
-__libc_start_main (int argc, char **argv,
-                  char **ev,
-                  ElfW (auxv_t) * auxvec,
-                  void (*rtld_fini) (void),
-                  struct startup_info *stinfo,
-                  char **stack_on_entry)
+__libc_start_main_impl (int argc, char **argv,
+                       char **ev,
+                       ElfW (auxv_t) * auxvec,
+                       void (*rtld_fini) (void),
+                       struct startup_info *stinfo,
+                       char **stack_on_entry)
 {
   /* the PPC SVR4 ABI says that the top thing on the stack will
      be a NULL pointer, so if not we assume that we're being called
@@ -99,3 +99,4 @@ __libc_start_main (int argc, char **argv,
                             stinfo->init, stinfo->fini, rtld_fini,
                             stack_on_entry);
 }
+DEFINE_LIBC_START_MAIN_VERSION
index 26c93dff05491bf3ad3878751fa7e6b1bb1e4498..76a16e2a6dad6e70b2684e508bdf03c2ce2ce93e 100644 (file)
@@ -2213,6 +2213,7 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
index f04b1677889765f42495238cdfcc36bb2ab92f8b..697f072fd43708a08c0f6a53668fe8d440bfd6d6 100644 (file)
@@ -2246,6 +2246,7 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
index c2ca00709e3a845525cc894e2513e8bc908ef1ed..2647bb51f19060a3a410575fda1d0ee75c156b7a 100644 (file)
@@ -2076,6 +2076,7 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
index 0ea50dc851198b12269888a2c1577db4dbc44b48..036b1c83450615240e0d2d8e00f144604c6907de 100644 (file)
@@ -2366,3 +2366,4 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
index 0263e284d4feaa5d0d041a0d8ca1288cd4ba8710..ff3225e16fd99215c0e04be529a5859c9ee75da1 100644 (file)
@@ -1933,3 +1933,4 @@ GLIBC_2.33 wprintf F
 GLIBC_2.33 write F
 GLIBC_2.33 writev F
 GLIBC_2.33 wscanf F
+GLIBC_2.34 __libc_start_main F
index 1626c5351f665d436d9368534fd60783b5a1ce9a..fb5ad9909fbe40263339644a2f77955d5b277dcd 100644 (file)
@@ -2133,3 +2133,4 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
index a66426eb4d8cd44fb34e0284e93a85021322264a..cead75acc5c2432544a5aa13a73892f3060ae3bd 100644 (file)
@@ -2211,6 +2211,7 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
index ab351873ae0296dcb9808f2a8ba85d9c027b7aca..31366dd7e6d90eda6ad229dbd7cac16b262dd033 100644 (file)
@@ -2112,6 +2112,7 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
index 22ceaa3d87fddc612754cf64e10769d5fa120bd3..a3a8be89100822c07898430680bad8d153d1211c 100644 (file)
@@ -2081,6 +2081,7 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index d36f228192f11fd7d5a9f6d481b94ddbc87cf4a4..8f505c5045717ae400fc2052259544ba16c76023 100644 (file)
@@ -2078,6 +2078,7 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index 59b4313280ca22616b505fe14e8e8ff233b1cb30..53ef6304f1c4aa362375c7914133bfd6ffcb2d4c 100644 (file)
@@ -2202,6 +2202,7 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
index 266dcdfa08b7d8fb0de9cfbff78dfcbe1edd64af..eba0cb156d9efacf9ba3ae40b895fe91280202cd 100644 (file)
@@ -2129,6 +2129,7 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index 2744bba4afbdd38b9ffcf2d20debf909195793f7..17ce5dfd582c28c0227b6c4ed2622231e2512aa3 100644 (file)
@@ -2088,6 +2088,7 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index ce2f4fb72b96d05c23a00466a3c8c6466652591a..17a1c839036672746009111c1f653ff68c32cc9a 100644 (file)
@@ -2185,3 +2185,4 @@ GLIBC_2.33 mknod F
 GLIBC_2.33 mknodat F
 GLIBC_2.33 stat F
 GLIBC_2.33 stat64 F
+GLIBC_2.34 __libc_start_main F
index 30fc9007c98b3ebdf09df7b037dfb208da3e43d5..1b3e36826b8a477474cee24d1c931429fbdf6d8f 100644 (file)
@@ -96,17 +96,13 @@ ENTRY (_start)
           which grow downwards).  */
        pushq %rsp
 
-#ifdef PIC
-       /* Pass address of our own entry points to .fini and .init.  */
-       mov __libc_csu_fini@GOTPCREL(%rip), %R8_LP
-       mov __libc_csu_init@GOTPCREL(%rip), %RCX_LP
+       /* These used to be the addresses of .fini and .init.  */
+       xorl %r8d, %r8d
+       xorl %ecx, %ecx
 
+#ifdef PIC
        mov main@GOTPCREL(%rip), %RDI_LP
 #else
-       /* Pass address of our own entry points to .fini and .init.  */
-       mov $__libc_csu_fini, %R8_LP
-       mov $__libc_csu_init, %RCX_LP
-
        mov $main, %RDI_LP
 #endif