Что надо делать - описано в ФАКе avr-libc. И даётся совет - добавить это в мэйкфайл, что-бы всегда учитывать изменения в исходнике. Итак - ***м мзг, читаем, медитируем, повторяем, пробуем, повторяем. Вуаля!
Где-нибудь в начале файла помещаем (подсмотрено на myROBOT):
# Название бинарного файла, включаемого в проект (во Flash-память, без расширения)
MY_BIN = [имя файла]
Правим:
# Define all object files.
OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
на:
OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) $(OBJDIR)/$(MY_BIN).o
Правим:
# Change the build target to build a HEX file or a library.
build: ima elf hex eep lss sym
на:
build: ima elf hex eep lss sym
Добавляем после (а может - и перед):
lib: $(LIBNAME)
строку: ima: $(MY_BIN).o
Добавляем, например - после:
# Link: create ELF output file from object files. etc.
строки:
# Копирование бинарного образа
$(MY_BIN).o :
$(OBJCOPY) --rename-section .data=.progmem.data,contents,alloc,load,readonly,data -I binary -O elf32-avr $(MY_BIN).bin $(OBJDIR)/$(MY_BIN).o
Сохраняем, смотрим куда надо и видим, что бинарник помещён сразу после таблицы прерываний по адресу 0х098.
А теперь - внимание. Вопрос: Полученные в ходе преобразований "константы" (_binary_*****_bin_start, _binary_*****_bin_end, _binary_*****_bin_size) получается использовать только интерпретируя их как переменные:
fuck1 = &_binary_font_split1_bin_start;
1e6c: 28 e9 ldi r18, 0x98 ; 152
1e6e: 30 e0 ldi r19, 0x00 ; 0
1e70: 30 93 08 01 sts 0x0108, r19
1e74: 20 93 07 01 sts 0x0107, r18
fuck1 = pgm_read_word(&_binary_font_split1_bin_start);
1ea0: f9 01 movw r30, r18
1ea2: 25 91 lpm r18, Z+
1ea4: 34 91 lpm r19, Z
1ea6: 30 93 08 01 sts 0x0108, r19
1eaa: 20 93 07 01 sts 0x0107, r18
Это потому, что бинарник "relocatable", а не гвоздями прибитый? Или как?