Связывание двоичного кода с функциями / данными в определенном месте в памяти
В настоящее время я нахожусь в процессе написания загрузчика промежуточной памяти для ATMega.
Я хотел бы разместить раздел часто используемых функций и данных в определенном месте в памяти, например:
ограниченный размер раздела загрузчика не преодоленбиблиотечные функции, драйверы и т. д. не воспроизводятся разделом приложения и поэтому занимают местоДля наглядности ниже приведена карта желаемого расположения памяти:
После некоторой помощи вэта тема на avrfreaks я дошел до того, что смог переместить весь код (в моем загрузчике + среда разработки библиотеки - приложения будут разрабатываться в отдельных проектах) без тегов__attribute__ ((section(".boot")))
в раздел с общей библиотекой успешно с помощью специального сценария компоновщика.
В ветке avrfreaks было предложено связать свои приложения с помощьюavr-objcopy --strip-all --keep-symbol=fred --keep-symbol=greg ... boot.elf dummy.elf
создать символьную ссылку на то, что у меня есть в моей общей библиотеке, а затем связать мои приложения с этим макетом памяти с помощьюavr-gcc -o app.elf -Wl,--just-symbols=dummy.elf app1.o app2.o ...
.
Проблема, с которой я здесь сталкиваюсь, заключается в том, что мне нужно указать каждый символ, который я хочу сохранить в моем dumy.elf. Я могу использоватьkeep-symbols=<file>
директива, чтобы указать текстовый файл список символов, чтобы сохранить, но я все еще должен создать этот список.
Я заметил, что есть куча символов, которые яне хочу включить (например, код настройки среды C, который является общим по названию, но отличается по функциональности как для загрузчика, так и для приложения), который начинается с префикса '_' (но, конечно, есть некоторые полезные и большие библиотечные функции с одинаковым префиксом, например * printf и математические процедуры). Возможно, не будет конфликтов, если я свяжу свое приложение с существующим кодом времени выполнения в приложении / загрузчике?
Как я могу сгенерировать список символов для моего раздела библиотеки, который содержит код, который я написал (возможно, некоторую магию sed и файлы заголовков сканирования) / исключает любые символы, которые могут конфликтовать при связывании приложения?
Проект можно посмотреть в его текущем состоянии наэтот репозиторий GitHub.
Изменить: я хочу пояснить, что ямог пометить все, что я хочу быть в разделе общей библиотеки с__attribute__ ((section(".library")))
, но так как я также хочу поделиться некоторыми довольно большими вещами libc (vsprintf и т. д.) между загрузчиком и приложением, это очень быстро становится громоздким. Поэтому я решил поместить все, не помеченное как загрузочное, в память библиотеки.область, край через скрипт компоновщика.
Возможно, мне просто нужен совет помой скрипт компоновщика, поскольку я не супер уверен, что я там делаю.