Обычно первая часть загрузчика (16-битная часть) записывается в сборке. Это происходит главным образом потому, что загрузчик должен выполнять задачи такого низкого уровня, что использование c на самом деле не стоит. Как только загрузчик переходит в защищенный или длинный режим, он может использовать c. Другая причина, по которой использование c является плохой идеей для загрузчика, состоит в том, что задача загрузчика обычно состоит в том, чтобы привести систему в состояние, в котором ядро может начать выполнение. На x86 это обычно означает переход в защищенный режим. Это подразумевает связывание 16-битного кода c с 32-битным кодом c (и, возможно, даже с 64-битным кодом). Это действительно трудно сделать.
Если вы действительно думаете, что хотите продолжить то, что делаете: файл a.out - это просто файл эльфа. В загрузчиках процессор начинает выполнение с адреса 0x7c00. Поэтому я полагаю, вам следует связать секцию .text с 0x7c00.
Еще один комментарий, который я хотел бы сделать, заключается в том, что на современном процессоре вам даже не нужно сильно беспокоиться о том, как получить разделы из файла a.out. Обычно UEFI может напрямую загружать файлы elf. И Кему тоже может.