Проверяя файл запуска, представленный в качестве примера в цепочке инструментов 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
с одним значением. Хотя после связывания они имеют значения, установленные компоновщиком (имея в виду, что значение компоновщика фактически сохраняется в адресе символа).