Символ принудительной установки файла описания компоновщика gcc по указанному адресу

У меня очень специфический вопрос о файле описания компоновщика gcc. У меня есть встроенный проект, и я должен убедиться, что главный символ или адрес главного символа присутствует по определенному адресу (файл эльфа).

Причина в том, что у меня есть микроконтроллер с загрузчиком. Этот загрузчик должен вызывать основную процедуру после загрузки. По этой причине я должен предоставить адрес для перехода после загрузки.

Есть ли способ использовать файл описания компоновщика, чтобы символ всегда находился сверху таблицы или вводил адрес, или я могу даже каким-то образом получить адрес символа, чтобы записать его обратно в определенное место?

Спасибо заранее.

8

Решение

Конечно, есть способ. Лучший вариант — использовать раздел только для вашей функции:

int start(void) __attribute__((section(".start")));

int start(void)
{
}

А затем в скрипте компоновщика:

SECTIONS
{
. = 0x1234; // <---- put here your address
.start :
{
*(.start)
}
}

Или что-то в этом роде (прошло довольно много времени с тех пор, как я использовал это).

9

Другие решения

Если у вас уже есть файл управления компоновщиком (я предполагаю, что вы используете цепочку инструментов gcc), вам просто нужно поместить объектный файл, содержащий вашу функцию main (), в самый первый раздел (и оставить его вне файла Makefile).

Вот пример:

MEMORY
{
rom (RX) : ORIGIN = START_ADDRESS, LENGTH = 0x0010000
}
SECTIONS
{
.text :
{
main.o (.text) /* this is the program entry point */
*(.text)
}
.data :
{
. = ALIGN(4);
*(.data)
}
}

(это немного упрощается, но я думаю, вы поняли). Раздел .text начинается с START_ADDRESS и до тех пор, пока вы убедитесь, что ваш main.o находится там (а также main () является первой функцией в нем), вы установлены.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector