Я знаю, что вы спрашивали предупреждения и предпочитаете не использовать опцию gcc, но это действительно просто.
Вы можете использовать оптимизацию компоновщика (--gc-section), чтобы удалить мертвый код из вашего приложения.
со страницы руководства gcc:
- ГЦ-разделы
--no-ГЦ-секции
Включить сбор мусора из неиспользуемых разделов ввода. Он игнорируется для целей, которые не поддерживают эту опцию. Поведение по умолчанию (не выполнение этой сборки мусора) можно восстановить, указав --no-gc-section в командной строке.
- gc-section определяет, какие входные разделы используются при проверке символов и перемещений. Раздел, содержащий символ ввода, и все разделы, содержащие символы, неопределенные в командной строке, будут сохранены, как и разделы, содержащие символы, на которые ссылаются динамические объекты. Обратите внимание, что при создании разделяемых библиотек компоновщик должен предполагать, что на любой видимый символ ссылаются. Как только этот начальный набор разделов был определен, компоновщик рекурсивно помечает как использованный любой раздел, на который ссылаются их перемещения. См. --Entry и --undefined.
Эта опция может быть установлена при выполнении частичной ссылки (активируется с опцией -r). В этом случае корень хранимых символов должен быть явно указан либо с помощью параметра --entry или --undefined, либо с помощью команды «ENTRY» в сценарии компоновщика.