Я пытаюсь уменьшить размер моего исполняемого файла. Я собираю с -ffunction-sections
-fdata-sections
и связь с -gc-sections
, но кажется, что некоторые символы, которые я считаю неиспользованными, не отбрасываются.
Есть ли какая-то команда в наборе инструментов GNU, которую я могу запустить, чтобы узнать, какие символы используются и где?
Вот мои типичные флаги сборки:
Компиляция: arm-none-eabi-g++.exe -Wall -O3 -mthumb -std=c++11 -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -fsingle-precision-constant -ffunction-sections -fdata-sections
Ссылка на сайт: arm-none-eabi-g++.exe -static -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -Wl,-gc-sections -Wl,-T"LinkerScript.ld
Спасибо за помощь.
Вы можете попробовать вариант компоновщика -Wl,--trace-symbol=<symbol_name>
, Он будет отображаться в выходных данных, где определен символ и где используется символ.
Создайте файл карты компоновщика с выводом перекрестных ссылок:
-Wl,-Map=output.map -Wl,--cref
Я не смог найти команду, которая показывала символьные зависимости. Однако я смог получить необходимую информацию, используя следующую технику:
/DISCARD/
раздел компоновщика скрипта. Это выведет сообщение об ошибке, показывающее, какой символ его использует. Это выглядит примерно так: <symbol0>' referenced in section '<symbol1>' of <lib0.a file path>(<object0 file path>): defined in discarded section '<symbol0>' of <lib1.a file path>(object1 file path>)
/DISCARD/
раздел, пока не найдете корень проблемы.Корень проблемы для меня был в том, что унаследовал один класс от другого. Это создало виртуальную таблицу, и компилятор не может удалить мертвый код, на который есть ссылка в виртуальной таблице.
Извлеченный урок: если вы хотите уменьшить размер кода и все еще использовать C ++, не используйте наследование. У цепочки инструментов GNU раньше была -fvtable-gc
переключиться, чтобы помочь с этим, но он был удален некоторое время назад. Я сделаю рефакторинг своего кода для решения моей конкретной проблемы.