Какие части кодовой базы делают бинарные файлы большими?

Я создал некоторый код для симулятора, и теперь я пытаюсь использовать TI-бесплатную инструментальную цепочку для кросс-компиляции с целью с 64kb nvram. Компилятор утверждает, что мой код составляет около 34kb за пределами ROM:

(...) msp430-elf/bin/ld: region 'ROM' overflowed by 33716 bytes

В другой строке говорится, что он не может помещать поле .text в его выделенное пространство. Я не могу поверить, что мои дополнения составляют 34kb, не говоря уже о том, что бинарные файлы переполняются на эту сумму.

  • Файлы.o, добавленные моим кодом в проект, представляют собой небольшую часть (200 КБ из 1,9 МБ) всего проекта, и я взял на себя большое количество компонентов, которые были в проекте для начала.
  • Я уже передаю компилятор -Os -s flags.
  • Новый код содержит около 100 символов строковых литералов.
  • В моем коде используются многие функции math.h (на самом деле это единственная часть, которая выполняет арифметику с плавающей запятой), сделайте вызов strtod и вызовите sprintf

Существуют ли какие-либо инструменты или методы, чтобы разрушить то, что заставляет бинарные файлы быть такими большими?

Ответ 1

У GNU binutils есть инструменты, которые помогут вам определить размер каждого символа или только каждого объектного файла.

Посмотрите на size например: https://manpages.debian.org/jessie/binutils/size.1.en.html

nm также стоит попробовать, так как он может отображать размер каждого символа в объектном коде: https://manpages.debian.org/jessie/binutils/nm.1.en.html

Тщательная проверка объема и size nm даст вам интуицию для того, что занимает много места, а что нет.

Знайте, что printf, sprintf и многие из более сложных библиотечных функций часто могут занимать до нескольких килобайт дополнительного ПЗУ.

Поддержка плавающей точки с использованием мягких поплавков также раздувает код по сравнению с использованием жесткого поплавка, то есть с использованием программной эмуляции и аппаратных команд для обработки плавающей запятой.

Иногда компилятор добавляет удивительное количество раздувания :)

Ответ 2

У меня также были проблемы с памятью с крошечным контроллером MSP430. Инструментальная привязка TI связывает большие библиотеки с вашим двоичным кодом, если возможно отрицательное значение, или используется плавающая точка. В моем случае это было около 10% - 20% от общего объема использования памяти.

TI free Code composer Studio обеспечивает очень мощную визуализацию памяти (View → Memory Allocation)

Что очень помогло мне изменить модель инициализации в настройках компоновщика и других параметрах оптимизации. В настоящее время я не работаю с контроллером MSP430, поэтому больше не могу рассказать вам подробности.

Ответ 3

Существует также AMAP, маленький и легкий gui для просмотра файлов.map: http://www.sikorskiy.net/prj/amap/

Было бы неплохо иметь инструмент kdirstat, который позволяет визуально сравнивать размеры символов.

Хотя я не был прямым ответом на этот вопрос, в итоге я использовал реализацию Voidware CORDIC, чтобы избежать использования больших функций в <math.h>: https://github.com/enthdegree/cordic_wrapped