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:
		| @@ -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 | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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++) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user