#arm #cortex-m #linker-scripts #thumb
#arm #cortex-m #компоновщик-скрипты #thumb
Вопрос:
Мы работаем над некоторым кодом для ARM Cortex M4 на чипе STM32.
Насколько я понимаю, в Cortex-M4 есть некоторые 32-разрядные инструкции, но это не 32-разрядные инструкции ARM, это всего лишь несколько специальных инструкций. Я думал, что соединение предназначено для перехода между наборами инструкций ARM и thumb. Итак, зачем сценарию компоновщика нужен клей?
.text :
{
. = ALIGN(4);
*(.text) /* .text sections (code) */
*(.text*) /* .text* sections (code) */
*(.glue_7) /* glue arm to thumb code */
*(.glue_7t) /* glue thumb to arm code */
Могу ли я удалить glue_7
и glue_7t
, поскольку процессор поддерживает только инструкции thumb? Освободится ли при этом какая-либо флэш-память?
Комментарии:
1. В этом разделе кода компоновщика просто сказано поместить туда код склейки, если таковой имеется. Если клея нет, ничего не генерируется. Посмотрите на свою карту ссылок, чтобы увидеть, есть ли там место, которое нужно освободить.
2. вы можете делать все, что хотите, в своем скрипте компоновщика и bootstrap. это ваше.
3. если он сломается, то library и т.д. Затем верните его обратно. там не должно быть никакого кода
4. внутренняя работа предназначена для перехода к / из инструкций thumb arm, да, и расширения thumb2 не являются инструкциями arm, они являются инструкциями thumb, как задокументировано (вы читали документы arm, да?) вы должны оставаться в режиме thumb, иначе вы получите ошибку.
5. @marc: комментарий old_timer является правильным ответом на ваш вопрос: эти разделы находятся здесь по историческим причинам и никогда не удалялись.
Ответ №1:
Опубликованный скрипт всегда будет создавать разделы для кода ARM / thumb, вызывающего thumb / ARM, если нечего вызывать, разделы пусты. Пустой раздел является доброкачественным.
Если вы хотите удалить неиспользуемые разделы без изменения компоновщика, чистым способом является выполнение устранения нерабочего кода с помощью --gc-sections
:
Как только объекты и статические библиотеки созданы с этими параметрами, компоновщик может выполнить удаление мертвого кода. Вы можете сделать это, установив параметр -Wl,—gc-sections для команды gcc или в разделе -largs gnatmake. Это приведет к сборке мусора из кода и данных, на которые никогда не ссылались.