Я использую MCU STM32F4 (Cortex-M4) и компилирую с помощью arm-none-eabi-g++ (я использую C++).
У меня есть требование сократить время, необходимое для загрузки моего двоичного файла во флэш-память MCU. Я понял, что могу сделать это, только загружая изменения в свой двоичный файл между модификациями. Однако компилятор генерирует интересный код, который делает это невозможным.
Рассмотрим следующие 2 программы:
(1)
int main()
{
printf("hello");
return 0
}
(2)
int main()
{
//printf("hello");
return 0
}
Просто удалив вызов printf
, двоичный файл кардинально изменится. Я вижу это, разобрав код с помощью arm-none-eabi-objdump -D mybinary
. Вот пример различий в WinMerge:
Как видно на изображении, почти все функции имеют немного другую инструкцию stmdaeq
, и я хочу узнать об этом больше.
Ответ на этот вопрос будет включать следующее:
- Я знаю, что такое инструкция
stmdaeq
, но почему она стоит в конце почти всех функций? Это эпилог функции? - Могу ли я что-нибудь сделать (параметры компилятора или иным образом), чтобы незначительные изменения кода, как в моем примере выше, не вызывали таких изменений во всем двоичном коде?
Я использую набор инструментов GNU Tools для встроенных процессоров ARM GCC.
Ваша помощь будет высоко оценена.
stmdaeq
на самом деле являются адресами, вставленными во время компоновки. Я обнаружил, что путем кропотливой организации и сортировки символов в моем скрипте компоновщика я могу сделать двоичный файл более последовательным между изменениями и достичь желаемого результата. - person Verax   schedule 10.07.2014