mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-13 04:30:07 +00:00
cheri: change __libc_start_main prototype
The prototype of __libc_start_main is changed to void __libc_start_main (int main (int, char **, char **, void *), int argc, char **argv, char **envp, void *auxv, void rtld_fini (void), void *sp); so envp is passed down separately and the unused init, fini args are dropped.
This commit is contained in:
parent
d5f9769d53
commit
8d2bab6e17
@ -210,11 +210,16 @@ STATIC int LIBC_START_MAIN (int (*main) (int, char **, char **
|
|||||||
MAIN_AUXVEC_DECL),
|
MAIN_AUXVEC_DECL),
|
||||||
int argc,
|
int argc,
|
||||||
char **argv,
|
char **argv,
|
||||||
|
#ifdef LIBC_START_MAIN_ENVP_ARG
|
||||||
|
char **envp,
|
||||||
|
#endif
|
||||||
#ifdef LIBC_START_MAIN_AUXVEC_ARG
|
#ifdef LIBC_START_MAIN_AUXVEC_ARG
|
||||||
ElfW(auxv_t) *auxvec,
|
ElfW(auxv_t) *auxvec,
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef LIBC_START_MAIN_NO_INITFINI_ARG
|
||||||
__typeof (main) init,
|
__typeof (main) init,
|
||||||
void (*fini) (void),
|
void (*fini) (void),
|
||||||
|
#endif
|
||||||
void (*rtld_fini) (void),
|
void (*rtld_fini) (void),
|
||||||
void *stack_end)
|
void *stack_end)
|
||||||
__attribute__ ((noreturn));
|
__attribute__ ((noreturn));
|
||||||
@ -233,15 +238,24 @@ STATIC int LIBC_START_MAIN (int (*main) (int, char **, char **
|
|||||||
STATIC int
|
STATIC int
|
||||||
LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
|
LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
|
||||||
int argc, char **argv,
|
int argc, char **argv,
|
||||||
|
#ifdef LIBC_START_MAIN_ENVP_ARG
|
||||||
|
char **envp,
|
||||||
|
#endif
|
||||||
#ifdef LIBC_START_MAIN_AUXVEC_ARG
|
#ifdef LIBC_START_MAIN_AUXVEC_ARG
|
||||||
ElfW(auxv_t) *auxvec,
|
ElfW(auxv_t) *auxvec,
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef LIBC_START_MAIN_NO_INITFINI_ARG
|
||||||
__typeof (main) init,
|
__typeof (main) init,
|
||||||
void (*fini) (void),
|
void (*fini) (void),
|
||||||
|
#endif
|
||||||
void (*rtld_fini) (void), void *stack_end)
|
void (*rtld_fini) (void), void *stack_end)
|
||||||
{
|
{
|
||||||
#ifndef SHARED
|
#ifndef SHARED
|
||||||
|
#ifdef LIBC_START_MAIN_ENVP_ARG
|
||||||
|
char **ev = envp;
|
||||||
|
#else
|
||||||
char **ev = &argv[argc + 1];
|
char **ev = &argv[argc + 1];
|
||||||
|
#endif
|
||||||
|
|
||||||
__environ = ev;
|
__environ = ev;
|
||||||
|
|
||||||
@ -358,11 +372,13 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
|
|||||||
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
||||||
GLRO(dl_debug_printf) ("\ninitialize program: %s\n\n", argv[0]);
|
GLRO(dl_debug_printf) ("\ninitialize program: %s\n\n", argv[0]);
|
||||||
|
|
||||||
|
#ifndef LIBC_START_MAIN_NO_INITFINI_ARG
|
||||||
if (init != NULL)
|
if (init != NULL)
|
||||||
/* This is a legacy program which supplied its own init
|
/* This is a legacy program which supplied its own init
|
||||||
routine. */
|
routine. */
|
||||||
(*init) (argc, argv, __environ MAIN_AUXVEC_PARAM);
|
(*init) (argc, argv, __environ MAIN_AUXVEC_PARAM);
|
||||||
else
|
else
|
||||||
|
#endif
|
||||||
/* This is a current program. Use the dynamic segment to find
|
/* This is a current program. Use the dynamic segment to find
|
||||||
constructors. */
|
constructors. */
|
||||||
call_init (argc, argv, __environ);
|
call_init (argc, argv, __environ);
|
||||||
|
@ -136,11 +136,10 @@ apply_rel (uintptr_t base, uintptr_t start, uintptr_t end)
|
|||||||
}
|
}
|
||||||
#endif /* !SHARED */
|
#endif /* !SHARED */
|
||||||
|
|
||||||
int main (int argc, char **argv);
|
int main (int argc, char **argv, char **envp, void *auxv);
|
||||||
|
|
||||||
void __libc_start_main (int main (int, char **),
|
void __libc_start_main (int main (int, char **, char **, void *),
|
||||||
int argc, char **argv,
|
int argc, char **argv, char **envp, void *auxv,
|
||||||
void *init, void *fini,
|
|
||||||
void rtld_fini (void), void *sp);
|
void rtld_fini (void), void *sp);
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -161,7 +160,11 @@ __real_start (void rtld_fini (void), uintptr_t *sp)
|
|||||||
|
|
||||||
int argc = *sp;
|
int argc = *sp;
|
||||||
char **argv = (char **) (sp + 1);
|
char **argv = (char **) (sp + 1);
|
||||||
__libc_start_main (main, argc, argv, 0, 0, rtld_fini, sp);
|
char **envp = argv + argc + 1;
|
||||||
|
char **p = envp;
|
||||||
|
while (*p) p++;
|
||||||
|
void *auxv = p + 1;
|
||||||
|
__libc_start_main (main, argc, argv, envp, auxv, rtld_fini, sp);
|
||||||
__builtin_trap ();
|
__builtin_trap ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
32
sysdeps/unix/sysv/linux/aarch64/morello/libc-start.c
Normal file
32
sysdeps/unix/sysv/linux/aarch64/morello/libc-start.c
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/* Override csu/libc-start.c on Morello.
|
||||||
|
Copyright (C) 2017-2022 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, see
|
||||||
|
<https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef SHARED
|
||||||
|
# include <ldsodefs.h>
|
||||||
|
# include <cpu-features.c>
|
||||||
|
|
||||||
|
extern struct cpu_features _dl_aarch64_cpu_features;
|
||||||
|
|
||||||
|
# define ARCH_INIT_CPU_FEATURES() init_cpu_features (&_dl_aarch64_cpu_features)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define LIBC_START_MAIN_ENVP_ARG
|
||||||
|
#define LIBC_START_MAIN_AUXVEC_ARG
|
||||||
|
#define LIBC_START_MAIN_NO_INITFINI_ARG
|
||||||
|
#define MAIN_AUXVEC_ARG
|
||||||
|
#include <csu/libc-start.c>
|
Loading…
Reference in New Issue
Block a user