Как получить доступ к определению переменной в скрипте компоновщика в c?

В скрипте компоновщика я определил PROVIDE(__KERNEL_BEGIN__ = .);.

Доступ к адресу возможен с:

extern uint32_t __KERNEL_BEGIN__[];

Но следующее не работает (дает неверный адрес):

extern uint32_t * __KERNEL_BEGIN__;

Посмотрел сборку. Первый метод, __KERNEL_BEGIN__, предоставляет точный адрес. Второй, __KERNEL_BEGIN__ = [address], ищет значение по адресу.

Значит, так и должно быть? Я не могу сказать разницу.


gcc c ld
person pete lin    schedule 12.10.2016    source источник


Ответы (2)


Вам нужно взять адрес переменной extern. Это не совсем интуитивно понятно, но объясняется в руководстве.

Теоретически extern может быть любым примитивным типом данных. По неизвестным мне причинам принято использовать char:

extern char __KERNEL_BEGIN__;

Затем, чтобы получить адрес, экспортированный из скрипта компоновщика, возьмите адрес __KERNEL_BEGIN__:

printf("Address: %08x\n", &__KERNEL_BEGIN__);

Вы можете прочитать об этом в руководстве для ld.

person Ryan    schedule 20.05.2017
comment
Я немного запутался в использовании оператора &, а не оператора *. Зная, что переменные скрипта компоновщика — это просто символы, значения которых представляют адреса памяти, я ожидаю, что *foo = 5 означает: записать 5 в ячейку памяти foo. Я не понимаю смысла &foo = 5. Любая помощь? - person Ahmed Adel; 09.09.2020

Это больше относится к вашему дополнительному вопросу под постом Райана, однако это также может помочь ответить на ваш первоначальный вопрос.

Переменные, определенные в сценариях компоновщика, не обрабатываются так же, как переменные, определенные в C; они скорее символы, чем что-либо еще. При доступе к этим символам, определенным в сценариях компоновщика, вы должны использовать оператор &.

Например, если бы у нас был следующий раздел в нашем скрипте компоновщика:

.data :
{
    _sdata = .;
    *(.data*);
    _edata = .;
} > ram AT >rom

Мы могли бы получить указатель на начало раздела .data следующим образом:

uint8_t *data_ptr = &_sdata;

Для дальнейшего чтения попробуйте документацию binutils или отличный учебник по скриптам компоновщика

Ваше здоровье

person Tyrel Kostyk    schedule 08.10.2020