Общий список:
- Убедитесь, что у вас отключены параметры отладки компилятора и компоновщика
- Компилировать и связывать со всеми включенными параметрами размера (-Os в gcc)
- Запуск
strip
на исполняемом файле
- Создайте файл карты и проверьте размеры ваших функций. Вы можете либо заставить ваш компоновщик сгенерировать файл карты (
-M
при использовании ld), либо использовать objdump в конечном исполняемом файле (имейте в виду, что это будет работать только на незаштрихованном исполняемом файле!) Это на самом деле не решит проблему , но он сообщит вам о худших преступниках.
- Используйте
nm
, чтобы исследовать символы, которые вызываются из каждого из ваших объектных файлов. Это должно помочь найти тех, кто вызывает функции, которые вы не хотите вызывать.
В первоначальном вопросе был подвопрос о включении только соответствующих функций. gcc
будет включать все функции в каждом объектном файле, который используется. Иными словами, если у вас есть объектный файл, который содержит 10 функций, все 10 функций включены в ваш исполняемый файл, даже если фактически вызывается одна 1.
Стандартные библиотеки (например, libc) будут разбивать функции на множество отдельных объектных файлов, которые затем архивируются. Затем исполняемый файл связывается с архивом.
Разбивая на множество объектных файлов, компоновщик может включать только те функции, которые фактически вызываются. (предполагается, что вы статически связываете)
Нет причины, по которой вы не можете сделать то же самое. Конечно, вы можете утверждать, что если функции не вызываются, вы, вероятно, можете удалить их самостоятельно.
Если вы статически связываетесь с другими библиотеками, вы также можете запускать над ними перечисленные выше инструменты, чтобы убедиться, что они следуют аналогичным правилам.