Я давно про это писал, но народ как-то не ценит, никому не надо. https://caxapa.ru/1504568.html
https://caxapa.ru/1345348.html
В общем - в ассемблерном стартапе надо заменить вызов _main на _start. Обнуление .bss убрать - он есть в _start
Для корректного обнуления .bss с помощью _start надо еще добавить в линкерный скрипт нужные метки. Подробностей не помню, но у меня там такой комментарий:
/* GCC v8 use _edata..._end for init BSS section to 0 (_start) */
/* GCC v12 use __bss_start..._end for init BSS section to 0 (_start) */
Т.е. желательно задать все 3 метки - _edata = __bss_start, и _end