Прошло много времени, но я видел, что вы использовали прагму для определения местоположения обработчика прерываний до того, как создали функцию, может, вам нужно сделать то же самое с main ()?
Это может быть обработано в файле .h - я не уверен. Я только когда-либо использовал ASM на PIC, и я явно обрабатывал все (т. Е. При 0x000 переход к основному; при переходе по адресу вектора прерывания к этому адресу памяти; по основному адресу выполняйте эти действия и т. Д.). 'main' для меня был определен как доступный адрес в разделе кода (который, как я вижу, вы сделали, запустил раздел кода, а затем определил main), но я считаю, что мне пришлось явно определить, что 'main' должен был начинаться с Адрес памяти в разделе кода. Опять же, это был ASM, но я не сомневаюсь, что вам нужно сделать что-то похожее - прагму, чтобы определить main как main.