RISC-V: Do not use _init/_fini

Introduce new host configuration variable "have_init_fini" which is set
to "yes" by default.  Override it for RISC-V to "no".

Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
This commit is contained in:
Sebastian Huber 2018-07-27 10:11:44 +02:00
parent 62a5c6b02c
commit 6158b30e3e
4 changed files with 16 additions and 11 deletions

View File

@ -41,14 +41,3 @@ _start:
call main
tail exit
.size _start, .-_start
.global _init
.type _init, @function
.global _fini
.type _fini, @function
_init:
_fini:
# These don't have to do anything since we use init_array/fini_array.
ret
.size _init, .-_init
.size _fini, .-_fini

View File

@ -47,6 +47,7 @@
# crt1_dir directory where crt1 object is found
# have_crt0 "yes"/"no" if crt0 is/isn't provided.
# "" if crt0 is provided when sys_dir is set
# have_init_fini have init/fini ("yes" or "no", set to "yes" by default)
# noinclude list of include files to not install
newlib_cflags=
@ -65,6 +66,7 @@ mach_add_setjmp=
crt1=
crt1_dir=
have_crt0=
have_init_fini=yes
use_libtool=no
have_sys_mach_dir=no
default_newlib_io_c99_formats=no
@ -266,6 +268,7 @@ case "${host_cpu}" in
machine_dir=riscv
newlib_cflags="${newlib_cflags} -DHAVE_NANOSLEEP"
default_newlib_atexit_dynamic_alloc="no"
have_init_fini=no
;;
rl78)
machine_dir=rl78
@ -920,6 +923,11 @@ if [ "x${xdr_dir}" = "x" ]; then
noinclude="${noinclude} rpc/types.h rpc/xdr.h"
fi
# Have init/finit if not explicitly specified otherwise
if [ "x${have_init_fini}" != "xno" ]; then
newlib_cflags="${newlib_cflags} -DHAVE_INIT_FINI"
fi
if test -z "${have_crt0}" && test -n "${sys_dir}"; then
have_crt0="yes"
fi

View File

@ -17,7 +17,9 @@
extern void (*__fini_array_start []) (void) __attribute__((weak));
extern void (*__fini_array_end []) (void) __attribute__((weak));
#ifdef HAVE_INIT_FINI
extern void _fini (void);
#endif
/* Run all the cleanup routines. */
void
@ -30,6 +32,8 @@ __libc_fini_array (void)
for (i = count; i > 0; i--)
__fini_array_start[i-1] ();
#ifdef HAVE_INIT_FINI
_fini ();
#endif
}
#endif

View File

@ -21,7 +21,9 @@ extern void (*__preinit_array_end []) (void) __attribute__((weak));
extern void (*__init_array_start []) (void) __attribute__((weak));
extern void (*__init_array_end []) (void) __attribute__((weak));
#ifdef HAVE_INIT_FINI
extern void _init (void);
#endif
/* Iterate over all the init routines. */
void
@ -34,7 +36,9 @@ __libc_init_array (void)
for (i = 0; i < count; i++)
__preinit_array_start[i] ();
#ifdef HAVE_INIT_FINI
_init ();
#endif
count = __init_array_end - __init_array_start;
for (i = 0; i < count; i++)