[PATCH] H8: Add support for preinit/init/fini array

Jeff Johnston jjohnstn@redhat.com
Tue Jul 14 23:36:08 GMT 2026


Patch merged.

-- Jeff J.

On Sun, Jul 12, 2026 at 4:09 PM Jan Dubiec <jdx@o2.pl> wrote:

> This patch adds support for .preinit_array, .init_array, and .fini_array
> for the H8 family when binutils and GCC are configured with
> "--enable-initfini-array".
>
> The changes to init.c and fini.c ensure that linker-defined symbols
> referenced from C code are not affected by target-specific symbol naming
> conventions. For example, GCC for H8 prefixes external symbol names with
> an underscore, whereas GCC for ARM does not. The asm keyword is used to
> associate C identifiers with the corresponding linker-defined symbol names
> in a target-independent manner.
>
> The patch has been tested on H8 wher it enables support for the
> initialization and finalization arrays and on ARM in order to verify that
> the changes do not introduce any regressions.
>
> Signed-off-by: Jan Dubiec <jdx@o2.pl>
> ---
>  newlib/libc/misc/fini.c         |  6 ++++--
>  newlib/libc/misc/init.c         | 12 ++++++++----
>  newlib/libc/sys/h8300hms/crt0.S |  6 ++++++
>  3 files changed, 18 insertions(+), 6 deletions(-)
>
> diff --git a/newlib/libc/misc/fini.c b/newlib/libc/misc/fini.c
> index 5f2016070..0c3a1e0d5 100644
> --- a/newlib/libc/misc/fini.c
> +++ b/newlib/libc/misc/fini.c
> @@ -14,8 +14,10 @@
>  #include <sys/types.h>
>
>  #ifdef _HAVE_INITFINI_ARRAY
> -extern void (*__fini_array_start []) (void) __attribute__((weak));
> -extern void (*__fini_array_end []) (void) __attribute__((weak));
> +extern void (*__fini_array_start []) (void) asm("__fini_array_start")
> +       __attribute__((weak));
> +extern void (*__fini_array_end []) (void) asm("__fini_array_end")
> +       __attribute__((weak));
>
>  #ifdef _HAVE_INIT_FINI
>  extern void _fini (void);
> diff --git a/newlib/libc/misc/init.c b/newlib/libc/misc/init.c
> index 3aef7ad06..5781535f9 100644
> --- a/newlib/libc/misc/init.c
> +++ b/newlib/libc/misc/init.c
> @@ -16,10 +16,14 @@
>  #ifdef _HAVE_INITFINI_ARRAY
>
>  /* These magic symbols are provided by the linker.  */
> -extern void (*__preinit_array_start []) (void) __attribute__((weak));
> -extern void (*__preinit_array_end []) (void) __attribute__((weak));
> -extern void (*__init_array_start []) (void) __attribute__((weak));
> -extern void (*__init_array_end []) (void) __attribute__((weak));
> +extern void (*__preinit_array_start []) (void)
> asm("__preinit_array_start")
> +       __attribute__((weak));
> +extern void (*__preinit_array_end []) (void) asm("__preinit_array_end")
> +       __attribute__((weak));
> +extern void (*__init_array_start []) (void) asm("__init_array_start")
> +       __attribute__((weak));
> +extern void (*__init_array_end []) (void) asm("__init_array_end")
> +       __attribute__((weak));
>
>  #ifdef _HAVE_INIT_FINI
>  extern void _init (void);
> diff --git a/newlib/libc/sys/h8300hms/crt0.S
> b/newlib/libc/sys/h8300hms/crt0.S
> index 757fb0477..020b957d6 100644
> --- a/newlib/libc/sys/h8300hms/crt0.S
> +++ b/newlib/libc/sys/h8300hms/crt0.S
> @@ -1,6 +1,12 @@
>  ; H8/300, H8/300H, H8/300S and H8SX start up file.
>
>  #include "setarch.h"
> +#include "newlib.h"
> +
> +#ifdef _HAVE_INITFINI_ARRAY
> +#define __init ___libc_init_array
> +#define __fini ___libc_fini_array
> +#endif
>
>  #ifdef __H8300__
>
> --
> 2.54.0
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://sourceware.org/pipermail/newlib/attachments/20260714/27bc0924/attachment.htm>


More information about the Newlib mailing list