Наличие в сценарии компоновщика определения источника и длины памяти

MEMORY
{
    RAM (rxai!w) :                  ORIGIN = 0x80000000 LENGTH = 34K
}

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

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

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

2 ответа

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

RAM_ORIGIN = 0x80000000;
RAM_LENGTH = 34K;

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

Я решил это с помощью препроцессора 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

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

Другие вопросы по тегам