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

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

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

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

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


person Thomas    schedule 30.01.2019    source источник


Ответы (2)


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

RAM_ORIGIN = 0x80000000;
RAM_LENGTH = 34K;

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

person Thomas    schedule 05.02.2019
comment
К вашему сведению, вместо передачи -Wl,common.ld вы можете передать -Wl,--defsym=RAM_ORIGIN=0x80000000 и -Wl,--defsym=RAM_LENGTH=34K. Затем вы можете указать его в своем Makefile, а не в отдельных файлах. - person FeelTheBurns; 27.11.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

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

person mfro    schedule 07.02.2019