Skrypt linkera: wstaw adres bezwzględny funkcji do wygenerowanego kodu
Mam pytanie związane z linkerem gcc.
Pracuję z wbudowanymi elementami (PIC32), ale kompilator i linker PIC32 są oparte na gcc, więc główne rzeczy powinny być wspólne dla „zwykłego” linkera gcc i linkera PIC32.
Aby zaoszczędzić miejsce w pamięci flash (co często jest niewystarczające na mikrokontrolerach), muszę umieścić kilka dużych funkcji w bootloaderze, a aplikacja powinna wywoływać te funkcje tylko za pomocą wskaźników.
Muszę więc utworzyć tabelę wektorów w wygenerowanym kodzie.
Próbuję uzyskać adres bezwzględny funkcji i zapisać go w wygenerowanym kodzie, ale nadal otrzymuję błędy.
W poniższym przykładzie próbuję uzyskać adres funkcji_formatted_write
.
Kod:
.user_addr_table _USER_ADDR_TABLE_ADDR :
{
KEEP(*(.user_addr_table))
LONG((ABSOLUTE(_formatted_write))); /* _formatted_write is a name of my function */
} > user_addr_table
Linker zwraca błąd: „unresolvable symbol '_formatted_write' referenced in expression
„
Zauważyłem, że jeśli piszę śmieci zamiast_formatted_write
, następnie zwraca błąd ”undefined symbol .....
", więc,_formatted_write
jest znany przez linker.
To sprawia, że myślę, że powinienem wykonać kilka dodatkowych kroków, aby uczynić go „rozwiązywalnym”. Ale nadal nie mam pojęcia, jak to zrobić.