Передайте переменную makefile в секцию компоновщика - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть загрузчик и приложение в одной флешке, которые построены отдельно.Я всегда запускаю в загрузчике, и прежде чем перейти к приложению, я хочу использовать crc32 в приложении, чтобы убедиться, что оно не повреждено.Для этого мне нужно вычислить и сохранить crc32 приложения по известному адресу при сборке приложения, чтобы позже получить его из загрузчика.В make-файле приложения я хочу сохранить результат команды оболочки, вычисляющей crc, в переменную, а затем сохранить эту переменную по указанному адресу в памяти.Поэтому мне интересно, можно ли передать переменную из make-файла в скрипт компоновщика, чтобы сохранить результат crc32 в указанном разделе памяти.Я думаю, что-то вроде:

Makefile:

CC = arm-none-eabi-gcc
CFLAGS = -mcpu=cortex-m0 -mthumb -mfloat-abi=soft -std=c99
CRC_RESULT = '"$(shell get_crc...)"'

$(CC) $(CFLAGS) -T"LinkerScript.ld" -Wl,-Map=output.map -Wl,CRC_RESULT -Wl

Linker-скрипт:

MEMORY
{
  FLASH (rx)      : ORIGIN = 0x08002000, LENGTH = 64K - 0x2000 - 0x04
  CRC (rx)        : ORIGIN = 0x0800FFFC, LENGTH = 0x04
  RAM (xrw)       : ORIGIN = 0x200000c0, LENGTH = 8K
}

SECTIONS
{
....
    .CrcSection :
  {
    CrcSection = CRC_RESULT;
  } > CRC
}

То, что я слышал, должно быть возможно напрямуюизмените двоичный файл с результатом crc в make-файле (не уверен в этом), но это немного похоже на хак.На мой взгляд, было бы проще прямо поместить переменную в правильный раздел памяти.Как вы можете видеть, я очень плохо знаком с make-файлами и линкерными скриптами.

Ответы [ 2 ]

0 голосов
/ 13 июля 2019

Это работает для меня:

CRC_RESULT = '"$(shell get_crc...)"'

a.out:    
    $(CC) $(CFLAGS) -T"LinkerScript.ld" -Wl,-Map=output.map -Wl,CRC_RESULT -Wl,'--defsym=CRC_RESULT=$(CRC_RESULT)'
0 голосов
/ 18 сентября 2018

Компоновщик на самом деле не предназначен для генерации / изменения кода.Мне не известен способ заставить его заполнять определенный раздел на основе параметров командной строки.Вы могли бы сделать что-то с эффектом:

crc.o: app_build_target
    echo "const char *APP_CRC=\"$(shell get_crc ...)\";" | $(CC) -c -o $@ -xc -

bootloader_build_target: crc.o $(BOOTLOADER_OBJS)
    $(LD) -o $@ $^ 

Это скомпилирует файл, который просто генерирует одну переменную, а затем связывает его со всеми другими объектами.Вам необходимо объявить extern const char * APP_CRC; в коде вашего загрузчика, прежде чем использовать его.

Для используемой команды $(CC):

  • -c указывает на отсутствие ссылки (т.е. предотвращаетнеопределенная ссылка на main ())
  • -o $@ указывает цель
  • -xc сообщает компилятору, на каком языке он анализируется (здесь необходимо ...)
  • - указывает компилятору принимать входные данные из stdin
...