Какие части кодовой базы делают бинарные файлы большими?
Я создал некоторый код для симулятора, и теперь я пытаюсь использовать 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