2016-02-09 5 views
0

Согласно моему пониманию ниже команда загружает значение «__image_copy_start» в регистр r1.как присвоено значение __image_copy_start в U-boot

ldr  r1, =__image_copy_start 

Я пытаюсь понять, как присваивается значение «__image_copy_start». Я не мог найти оператор присваивания, который присваивает значение «__image_copy_start», но я мог видеть следующие объявления в файле «arch/arc/lib/sections.c».

char __image_copy_start[0] __attribute__((section(".__image_copy_start"))); 
char __image_copy_end[0] __attribute__((section(".__image_copy_end"))); 

кажется __attribute__((section(""))) используется для размещения переменных в специальных разделах (В приведенном выше заявлении «__image_copy_start [0]» будут размещены в разделе «.__ image_copy_start»). Можете ли вы помочь понять следующее.

  1. Как присвоено значение "__image_copy_start [0]"?
  2. Почему «__image_copy_start» объявлен как массив «char __image_copy_start [0]« почему бы не «char __image_copy_start»?

ответ

0

__image_copy_start назначается позже по линкера.

Значение взято из сценария компоновщика. Компилятор просто оставил переменную пустой, просто сохранив ссылку в таблице символов для компоновщика, чтобы выполнить задание. При связывании компоновщик помещает туда адрес, соответствующий началу раздела «__image_copy_start». «Раздел» в контексте компоновщика просто означает какое-то адресное пространство. Это может быть фиксированный диапазон адресов или размещен последовательно.

Уловка в коде C просто сообщает компилятору & компоновщик, чтобы создать указатель, который будет инициализирован, указывая на начало этого раздела.

+0

Спасибо за ответ. Почему он объявлен как массив? В вашей таблице объектов ответа есть таблица символов? – user3693586

+0

Его способ иметь на char, зарезервированном в разделе. Да, я имею в виду таблицу символов. – Antoine

+0

Я мог видеть следующие две записи для «__image_copy_start» в таблице символов. Можете ли вы помочь понять это. # arm-linux-gnueabihf-objdump -t arch/arm/lib/sections.o; запись 1: 00000000 л д .__ image_copy_start \t 00000000 .__ image_copy_start вход 2: 00000000 г О .__ image_copy_start \t 00000000 __image_copy_start – user3693586