Наличие в сценарии компоновщика определения источника и длины памяти
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
В этом примере скрипт компоновщика даже #include
S заголовочный файл (не показан) для определения TARGET_ADDRESS
чтобы у нас было одинаковое определение в коде и в скрипте компоновщика. Вам просто нужно убедиться, что этот *.h файл не содержит операторов, которые мешают компоновщику (должен содержать только определения препроцессора).