Инициализация стека в наборе инструментов GNU ARM - PullRequest
1 голос
/ 08 апреля 2020

Проверяя файл запуска, представленный в качестве примера в цепочке инструментов GNU ARM, я не мог понять одну вещь.

Представленные здесь фрагменты кода взяты из примеров, включенных в файлы встроенного набора инструментов GNU ARM, загруженные с официального сайта . Код компилируется и все вроде бы хорошо.

Мне интересно, почему они написали этот код именно так, почему, например, они используют одинаковые имена?

Я интересно, почему мой компоновщик не жалуется на ошибку множественного определения для __StackTop и __StackLimit. Вот часть файла startup_ARMCM0.S

    .syntax unified
    .arch   armv6-m

    .section .stack
    .align  3
#ifdef __STACK_SIZE
    .equ    Stack_Size, _*emphasized text*_STACK_SIZE
#else
    .equ    Stack_Size, 0xc00
#endif
    .globl  __StackTop
    .globl  __StackLimit
__StackLimit:
    .space  Stack_Size
    .size   __StackLimit, . - __StackLimit
__StackTop:
    .size   __StackTop, . - __StackTop

Если компоновщик определяет те же символы: __StackTop и __StackLimit.

.stack_dummy (COPY):
    {
        *(.stack*)
    } > RAM

    /* Set stack top to end of RAM, and stack limit move down by
     * size of stack_dummy section */
    __StackTop = ORIGIN(RAM) + LENGTH(RAM);
    __StackLimit = __StackTop - SIZEOF(.stack_dummy);
    PROVIDE(__stack = __StackTop);

При проверке документации компоновщика было написано, что, учитывая пример:

SECTIONS
{
.text :
    {
    *(.text)
    _etext = .;
    PROVIDE(etext = .);
    }
}

В этом примере, если программа определяет _etext (с ведущей подчеркивание), компоновщик выдаст ошибку множественного определения. Если, с другой стороны, программа определяет etext (без начального подчеркивания), компоновщик будет молча использовать определение в программе. Если программа ссылается на etext, но не определяет его, компоновщик будет использовать определение в скрипте компоновщика.

Кроме того, при использовании readelf -s просто для проверки символов, сгенерированных из файла сборки startup_ARMCM0.S без ссылок я вижу символы __StackTop и __StackLimit с одним значением. Хотя после связывания они имеют значения, установленные компоновщиком (имея в виду, что значение компоновщика фактически сохраняется в адресе символа).

...