GCC —gc-секции и поиск символьных зависимостей

Я пытаюсь уменьшить размер моего исполняемого файла. Я собираю с -ffunction-sections -fdata-sections и связь с -gc-sections, но кажется, что некоторые символы, которые я считаю неиспользованными, не отбрасываются.

Есть ли какая-то команда в наборе инструментов GNU, которую я могу запустить, чтобы узнать, какие символы используются и где?

  • Набор инструментов: GNU arm-none-eabi
  • Платформа: Cortex-M4
  • Язык: C ++

Вот мои типичные флаги сборки:

Компиляция: 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

Спасибо за помощь.

3

Решение

Вы можете попробовать вариант компоновщика -Wl,--trace-symbol=<symbol_name>, Он будет отображаться в выходных данных, где определен символ и где используется символ.

3

Другие решения

Создайте файл карты компоновщика с выводом перекрестных ссылок:

-Wl,-Map=output.map -Wl,--cref

2

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

  • Добавьте соответствующий символ к /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 переключиться, чтобы помочь с этим, но он был удален некоторое время назад. Я сделаю рефакторинг своего кода для решения моей конкретной проблемы.

2
По вопросам рекламы [email protected]