Ни при чём тут CMSIS. Функцию __libc_init_array() предоставляет
библиотека компилятора - это вызов конструкторов для статических
объёктов. Вообще, мне у них ld-скрипт не нравится, мусора много. Стоит указать ENTRY(Reset_Handler).
Возможно нужно сделать так:
extern void __libc_init_array();
А символ _init используется внутри этой функции. Его упоминание есть в ld-скрипте. Вот такой вариант реализации я нашел:
extern void _init (void);
/* Iterate over all the init routines. */
void
__libc_init_array (void)
{
size_t count;
size_t i;
count = __preinit_array_end - __preinit_array_start;
for (i = 0; i < count; i++)
__preinit_array_start[i] ();
_init ();
count = __init_array_end - __init_array_start;
for (i = 0; i < count; i++)
__init_array_start[i] ();
}