Наличие в компоновщике скрипта для начала и длины памяти - PullRequest
0 голосов
/ 30 января 2019
MEMORY
{
    RAM (rxai!w) :                  ORIGIN = 0x80000000 LENGTH = 34K
}

Допустим, у меня есть раздел в скрипте компоновщика, как указано выше.Могу ли я иметь определение для 0x80000000 и 34K.Я хочу, чтобы это выглядело как

MEMORY
{
    RAM (rxai!w) :                  ORIGIN = RAM_ORIGIN LENGTH = RAM_LENGTH
}

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

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Я решил это с помощью препроцессора C cpp.

Мои сценарии компоновщика содержат «переменные», которые можно «заполнить» из Makefile, вызывая cpp для фактических значений:

LDCSRC=script.lk.in
LDCDILE=script.lk

$(LDCFILE): $(LDCSRC)
        $(Q)echo CPP $<
        $(Q)$(CPP) $(INCLUDE) -DOBJDIR=$(1)/objs -P -DFORMAT_ELF=$(FORMAT_ELF) -D$$(MACHINE) $$< -o $$@

сам скрипт компоновщика может быть затем «усилен» с помощью макросов cpp:

#ifdef COMPILE_RAM
#define ROMFLAGS    WX
#else
#define ROMFLAGS    RX
#endif /* COMPILE_RAM */

MEMORY
{
    _rom (ROMFLAGS) : ORIGIN = TARGET_ADDRESS, LENGTH = 0x00100000

В этом примере скрипт компоновщика даже #include sa заголовочный файл C (не показан)) определить TARGET_ADDRESS, чтобы убедиться, что у нас одинаковое определение в коде и в скрипте компоновщика.Вам просто нужно убедиться, что этот * .h файл не содержит операторов, которые мешают компоновщику (должен содержать только определения препроцессора).

0 голосов
/ 05 февраля 2019

Я подумал, что имея следующий файл, такой как common.ld, в следующем формате,

RAM_ORIGIN = 0x80000000;
RAM_LENGTH = 34K;

работает.Но этот common.ld не может быть включен непосредственно в скрипт компоновщика с помощью INCLUDE.Если я передаю его в командной строке как -Wl, common.ld, тогда он работает.

...