Это часть кода инициализации скачанной прошивки какого-то микроконтроллера stm32f030. Разобрал с помощью радара2. Он вызывается после инициализации часов, но до инициализации кучи.
0x0800335c 00f00bf8 bl fcn.08003376
0x08003360 0028 cmp r0, 0
0x08003362 01d0 beq 0x8003368
0x08003364 fff7d4ff bl INIT2
0x08003368 0020 movs r0, 0
[...]
0x08003376 0120 movs r0, 1
0x08003378 7047 bx lr
Насколько я могу судить, r0 всегда устанавливается в 1, поэтому INIT2 никогда не пропускается. Я не понимаю. Что мне не хватает?
Без LTO функция в другом модуле не будет встроена. Если есть другой исходный файл с функцией DeviceSupportsFeatureX, то он будет выглядеть так.
Отличная идея. Но я думаю, что INIT2 является частью любого компилятора, который написал код запуска и выполняет инициализацию кучи. Это не особенно легко сказать, потому что, похоже, используется какой-то материал таблицы переходов, сгенерированный таблицей памяти ... так что тогда это флаг «включена ли функция», это было бы что-то вроде «используем ли мы флаг компилятора c». было бы проще, если бы я знал, какой компилятор это сделал.
Это может быть код, который распознает, выполняется ли он из ОЗУ или ПЗУ. «INIT2» не потребуется, если он работает из ОЗУ. Наверное, вы всегда запускаете из ПЗУ?
Я согласен с интерпретацией ElderBug в комментариях, что первый блок кода принадлежит модулю, поддерживающему несколько сборок, а вторая функция — модулю, сконфигурированному для конкретной сборки.
Если вы не отредактируете вопрос, чтобы предоставить более подробную информацию, мы можем только догадываться о цели, но вот одна правдоподобная интерпретация, похожая на код, над которым я работал:
Вы хотите пропустить инициализацию кучи в INIT2 при «горячей» перезагрузке, когда оперативная память сохраняется в режиме пониженного энергопотребления. Конкретный двоичный файл, который у вас есть, не поддерживает режимы с низким энергопотреблением, поэтому его функция жестко закодирована для возврата ненулевого значения, но в другой сборке он может считывать регистры питания и может возвращать ноль, если ОЗУ было сохранено.
Возможно, эта прошивка используется для нескольких устройств. У кого-то 1, у кого-то 0. Видимо компилятор не смог оптимизировать.