From 035c012e32c11e84d64905efaf55e74f704d3668 Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Thu, 25 Feb 2021 12:10:57 +0100 Subject: [PATCH] Reduce the statically linked startup code [BZ #23323] 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. --- csu/Makefile | 10 +- csu/Versions | 3 + csu/elf-init.c | 107 ----------- csu/libc-start.c | 166 ++++++++++++++++-- elf/dl-init.c | 8 +- sysdeps/aarch64/start.S | 14 +- sysdeps/alpha/start.S | 5 +- sysdeps/arc/start.S | 7 +- sysdeps/arm/start.S | 22 +-- sysdeps/csky/abiv2/start.S | 17 +- sysdeps/generic/ldsodefs.h | 6 +- sysdeps/hppa/dl-lookupcfg.h | 2 +- sysdeps/hppa/start.S | 26 +-- sysdeps/i386/start.S | 14 +- sysdeps/ia64/dl-lookupcfg.h | 2 +- sysdeps/ia64/start.S | 9 +- sysdeps/m68k/start.S | 13 +- sysdeps/mach/hurd/i386/libc.abilist | 1 + sysdeps/microblaze/start.S | 8 +- sysdeps/mips/start.S | 18 +- sysdeps/nios2/start.S | 17 +- sysdeps/powerpc/powerpc32/start.S | 4 +- sysdeps/powerpc/powerpc64/start.S | 4 +- sysdeps/riscv/start.S | 4 +- sysdeps/s390/s390-32/start.S | 10 +- sysdeps/s390/s390-64/start.S | 4 +- sysdeps/sh/start.S | 9 +- sysdeps/sparc/sparc32/start.S | 12 +- sysdeps/sparc/sparc64/start.S | 12 +- sysdeps/unix/sysv/linux/aarch64/libc.abilist | 1 + sysdeps/unix/sysv/linux/alpha/libc.abilist | 1 + sysdeps/unix/sysv/linux/arc/libc.abilist | 1 + sysdeps/unix/sysv/linux/arm/be/libc.abilist | 1 + sysdeps/unix/sysv/linux/arm/le/libc.abilist | 1 + sysdeps/unix/sysv/linux/csky/libc.abilist | 1 + sysdeps/unix/sysv/linux/hppa/libc.abilist | 1 + sysdeps/unix/sysv/linux/i386/libc.abilist | 1 + sysdeps/unix/sysv/linux/ia64/libc.abilist | 1 + .../sysv/linux/m68k/coldfire/libc.abilist | 1 + .../unix/sysv/linux/m68k/m680x0/libc.abilist | 1 + .../sysv/linux/microblaze/be/libc.abilist | 1 + .../sysv/linux/microblaze/le/libc.abilist | 1 + .../sysv/linux/mips/mips32/fpu/libc.abilist | 1 + .../sysv/linux/mips/mips32/nofpu/libc.abilist | 1 + .../sysv/linux/mips/mips64/n32/libc.abilist | 1 + .../sysv/linux/mips/mips64/n64/libc.abilist | 1 + sysdeps/unix/sysv/linux/nios2/libc.abilist | 1 + sysdeps/unix/sysv/linux/powerpc/libc-start.c | 13 +- .../linux/powerpc/powerpc32/fpu/libc.abilist | 1 + .../powerpc/powerpc32/nofpu/libc.abilist | 1 + .../linux/powerpc/powerpc64/be/libc.abilist | 1 + .../linux/powerpc/powerpc64/le/libc.abilist | 1 + .../unix/sysv/linux/riscv/rv32/libc.abilist | 1 + .../unix/sysv/linux/riscv/rv64/libc.abilist | 1 + .../unix/sysv/linux/s390/s390-32/libc.abilist | 1 + .../unix/sysv/linux/s390/s390-64/libc.abilist | 1 + sysdeps/unix/sysv/linux/sh/be/libc.abilist | 1 + sysdeps/unix/sysv/linux/sh/le/libc.abilist | 1 + .../sysv/linux/sparc/sparc32/libc.abilist | 1 + .../sysv/linux/sparc/sparc64/libc.abilist | 1 + .../unix/sysv/linux/x86_64/64/libc.abilist | 1 + .../unix/sysv/linux/x86_64/x32/libc.abilist | 1 + sysdeps/x86_64/start.S | 12 +- 63 files changed, 276 insertions(+), 315 deletions(-) delete mode 100644 csu/elf-init.c diff --git a/csu/Makefile b/csu/Makefile index c9385df2e9e..e587434be86 100644 --- a/csu/Makefile +++ b/csu/Makefile @@ -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 -# , -# . -# 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)) diff --git a/csu/Versions b/csu/Versions index 43010c34430..8e1b21948e8 100644 --- a/csu/Versions +++ b/csu/Versions @@ -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 index 6e96ab7fce9..00000000000 --- a/csu/elf-init.c +++ /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 - . */ - -#include -#include - - -/* 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 -} diff --git a/csu/libc-start.c b/csu/libc-start.c index feb0d7ce11f..05ff7afddf5 100644 --- a/csu/libc-start.c +++ b/csu/libc-start.c @@ -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 @@ -15,10 +16,15 @@ License along with the GNU C Library; if not, see . */ +/* 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 #include #include @@ -29,6 +35,8 @@ #include #include #include +#include +#include #include @@ -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 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 diff --git a/elf/dl-init.c b/elf/dl-init.c index b7e4b8a3afc..f924d26642d 100644 --- a/elf/dl-init.c +++ b/elf/dl-init.c @@ -22,10 +22,6 @@ #include -/* 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 diff --git a/sysdeps/aarch64/start.S b/sysdeps/aarch64/start.S index 3761cbd7ee0..417da8802b9 100644 --- a/sysdeps/aarch64/start.S +++ b/sysdeps/aarch64/start.S @@ -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) */ diff --git a/sysdeps/alpha/start.S b/sysdeps/alpha/start.S index f3eb2029e1b..65dcd4d3927 100644 --- a/sysdeps/alpha/start.S +++ b/sysdeps/alpha/start.S @@ -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 diff --git a/sysdeps/arc/start.S b/sysdeps/arc/start.S index dbec87e6bb7..5302a57cab8 100644 --- a/sysdeps/arc/start.S +++ b/sysdeps/arc/start.S @@ -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 diff --git a/sysdeps/arm/start.S b/sysdeps/arm/start.S index 30f69e1b076..9b56bc0cca0 100644 --- a/sysdeps/arm/start.S +++ b/sysdeps/arm/start.S @@ -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 diff --git a/sysdeps/csky/abiv2/start.S b/sysdeps/csky/abiv2/start.S index d65e37e61b0..a565cfa87b5 100644 --- a/sysdeps/csky/abiv2/start.S +++ b/sysdeps/csky/abiv2/start.S @@ -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 diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h index 9720a4e4467..ea3f7a69d05 100644 --- a/sysdeps/generic/ldsodefs.h +++ b/sysdeps/generic/ldsodefs.h @@ -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 diff --git a/sysdeps/hppa/dl-lookupcfg.h b/sysdeps/hppa/dl-lookupcfg.h index 29d994bfc26..a9a927f26c6 100644 --- a/sysdeps/hppa/dl-lookupcfg.h +++ b/sysdeps/hppa/dl-lookupcfg.h @@ -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); \ } diff --git a/sysdeps/hppa/start.S b/sysdeps/hppa/start.S index 2fe73c9aaee..4a1877f8e8b 100644 --- a/sysdeps/hppa/start.S +++ b/sysdeps/hppa/start.S @@ -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 @@ -52,10 +50,6 @@ .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) */ diff --git a/sysdeps/i386/start.S b/sysdeps/i386/start.S index 24c806cfecd..5296b27e651 100644 --- a/sysdeps/i386/start.S +++ b/sysdeps/i386/start.S @@ -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. */ diff --git a/sysdeps/ia64/dl-lookupcfg.h b/sysdeps/ia64/dl-lookupcfg.h index 209d926bad6..58ca32424b0 100644 --- a/sysdeps/ia64/dl-lookupcfg.h +++ b/sysdeps/ia64/dl-lookupcfg.h @@ -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); \ } diff --git a/sysdeps/ia64/start.S b/sysdeps/ia64/start.S index 0018acc8218..b28f8cb4296 100644 --- a/sysdeps/ia64/start.S +++ b/sysdeps/ia64/start.S @@ -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 diff --git a/sysdeps/m68k/start.S b/sysdeps/m68k/start.S index c36b34f8d95..98da4db9f3d 100644 --- a/sysdeps/m68k/start.S +++ b/sysdeps/m68k/start.S @@ -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. */ diff --git a/sysdeps/mach/hurd/i386/libc.abilist b/sysdeps/mach/hurd/i386/libc.abilist index 509e9b7cb08..e10a286d2ef 100644 --- a/sysdeps/mach/hurd/i386/libc.abilist +++ b/sysdeps/mach/hurd/i386/libc.abilist @@ -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 diff --git a/sysdeps/microblaze/start.S b/sysdeps/microblaze/start.S index dcb202a63b5..6589bd4dc74 100644 --- a/sysdeps/microblaze/start.S +++ b/sysdeps/microblaze/start.S @@ -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 diff --git a/sysdeps/mips/start.S b/sysdeps/mips/start.S index 28e2ed17adf..4ec42a2a7fb 100644 --- a/sysdeps/mips/start.S +++ b/sysdeps/mips/start.S @@ -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 diff --git a/sysdeps/nios2/start.S b/sysdeps/nios2/start.S index 0a6c587de34..7c9696977f6 100644 --- a/sysdeps/nios2/start.S +++ b/sysdeps/nios2/start.S @@ -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 diff --git a/sysdeps/powerpc/powerpc32/start.S b/sysdeps/powerpc/powerpc32/start.S index a721a18775d..39ce1a18ff6 100644 --- a/sysdeps/powerpc/powerpc32/start.S +++ b/sysdeps/powerpc/powerpc32/start.S @@ -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" diff --git a/sysdeps/powerpc/powerpc64/start.S b/sysdeps/powerpc/powerpc64/start.S index 612c846632e..71c0c679267 100644 --- a/sysdeps/powerpc/powerpc64/start.S +++ b/sysdeps/powerpc/powerpc64/start.S @@ -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)) diff --git a/sysdeps/riscv/start.S b/sysdeps/riscv/start.S index 9c940350153..806f6aacd61 100644 --- a/sysdeps/riscv/start.S +++ b/sysdeps/riscv/start.S @@ -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 diff --git a/sysdeps/s390/s390-32/start.S b/sysdeps/s390/s390-32/start.S index aba90739c1f..b6cfa4caf37 100644 --- a/sysdeps/s390/s390-32/start.S +++ b/sysdeps/s390/s390-32/start.S @@ -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 diff --git a/sysdeps/s390/s390-64/start.S b/sysdeps/s390/s390-64/start.S index 0d9d30916d1..4e6526308ae 100644 --- a/sysdeps/s390/s390-64/start.S +++ b/sysdeps/s390/s390-64/start.S @@ -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 diff --git a/sysdeps/sh/start.S b/sysdeps/sh/start.S index ab29f194f70..606ee592222 100644 --- a/sysdeps/sh/start.S +++ b/sysdeps/sh/start.S @@ -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: diff --git a/sysdeps/sparc/sparc32/start.S b/sysdeps/sparc/sparc32/start.S index 45ca77da3e9..00bf898fb95 100644 --- a/sysdeps/sparc/sparc32/start.S +++ b/sysdeps/sparc/sparc32/start.S @@ -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 diff --git a/sysdeps/sparc/sparc64/start.S b/sysdeps/sparc/sparc64/start.S index 210fbaff904..8520717eba2 100644 --- a/sysdeps/sparc/sparc64/start.S +++ b/sysdeps/sparc/sparc64/start.S @@ -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 diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist index 4cc1c6a5918..bac795262dd 100644 --- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist +++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist index 26ad9845e41..897f70db221 100644 --- a/sysdeps/unix/sysv/linux/alpha/libc.abilist +++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/arc/libc.abilist b/sysdeps/unix/sysv/linux/arc/libc.abilist index bb9dfd4daf6..604d259ad68 100644 --- a/sysdeps/unix/sysv/linux/arc/libc.abilist +++ b/sysdeps/unix/sysv/linux/arc/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/arm/be/libc.abilist b/sysdeps/unix/sysv/linux/arm/be/libc.abilist index 3b0a47e967c..094236f7134 100644 --- a/sysdeps/unix/sysv/linux/arm/be/libc.abilist +++ b/sysdeps/unix/sysv/linux/arm/be/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/arm/le/libc.abilist b/sysdeps/unix/sysv/linux/arm/le/libc.abilist index 9ab39248881..2bb4d31e81f 100644 --- a/sysdeps/unix/sysv/linux/arm/le/libc.abilist +++ b/sysdeps/unix/sysv/linux/arm/le/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist b/sysdeps/unix/sysv/linux/csky/libc.abilist index 14a84dac8fb..d4291fecfbf 100644 --- a/sysdeps/unix/sysv/linux/csky/libc.abilist +++ b/sysdeps/unix/sysv/linux/csky/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist index 5c8502f3d3b..1fd2a862f68 100644 --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist index ddc58370590..943331f01eb 100644 --- a/sysdeps/unix/sysv/linux/i386/libc.abilist +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist index e3b345b803c..f530151bde0 100644 --- a/sysdeps/unix/sysv/linux/ia64/libc.abilist +++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist index 25f2d1c08f2..6e76b6dcaad 100644 --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist index c4891479d36..7541b8289f4 100644 --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist index 143b0163b4a..6cf1936c42a 100644 --- a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist +++ b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist index 13d374a031e..98730ebcdad 100644 --- a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist +++ b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist index b2295f19378..92fa6cbc736 100644 --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist index 4c786070d05..265a49e74eb 100644 --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist index aa9c6a4dcaf..cfa5e1111ba 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist index 5939588ad59..8c03ac52cd0 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist index 92556c42373..17f5609e067 100644 --- a/sysdeps/unix/sysv/linux/nios2/libc.abilist +++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/powerpc/libc-start.c b/sysdeps/unix/sysv/linux/powerpc/libc-start.c index 66f5effe8a6..4d681dad066 100644 --- a/sysdeps/unix/sysv/linux/powerpc/libc-start.c +++ b/sysdeps/unix/sysv/linux/powerpc/libc-start.c @@ -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 diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist index 26c93dff054..76a16e2a6da 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist index f04b1677889..697f072fd43 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist index c2ca00709e3..2647bb51f19 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist index 0ea50dc8511..036b1c83450 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist index 0263e284d4f..ff3225e16fd 100644 --- a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist +++ b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist index 1626c5351f6..fb5ad9909fb 100644 --- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist +++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist index a66426eb4d8..cead75acc5c 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist index ab351873ae0..31366dd7e6d 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/sh/be/libc.abilist b/sysdeps/unix/sysv/linux/sh/be/libc.abilist index 22ceaa3d87f..a3a8be89100 100644 --- a/sysdeps/unix/sysv/linux/sh/be/libc.abilist +++ b/sysdeps/unix/sysv/linux/sh/be/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/sh/le/libc.abilist b/sysdeps/unix/sysv/linux/sh/le/libc.abilist index d36f228192f..8f505c50457 100644 --- a/sysdeps/unix/sysv/linux/sh/le/libc.abilist +++ b/sysdeps/unix/sysv/linux/sh/le/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist index 59b4313280c..53ef6304f1c 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist index 266dcdfa08b..eba0cb156d9 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist index 2744bba4afb..17ce5dfd582 100644 --- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist index ce2f4fb72b9..17a1c839036 100644 --- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist @@ -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 diff --git a/sysdeps/x86_64/start.S b/sysdeps/x86_64/start.S index 30fc9007c98..1b3e36826b8 100644 --- a/sysdeps/x86_64/start.S +++ b/sysdeps/x86_64/start.S @@ -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 -- 2.47.2