Я не уверен, о объекта уровне, но я полагаю, вы могли бы быть в состоянии решить это на символ уровне с использованием CFLAGS="-fdata-sections -ffunction-sections"
и LDFLAGS="-Wl,--gc-sections -Wl,--print-gc-sections"
. Это должно избавиться от кода для всех непринятых символов и отобразить удаленные символы для вас, что может быть полезно, если по какой-то причине вы решите вернуться на уровень объектных файлов и хотите идентифицировать объектные файлы, содержащие только удаленные символы.
Чтобы быть более точным, указанные множители компилятора запросят компилятор для размещения каждой функции или глобальной переменной в разделе для себя, а флаг компоновщика --gc-sections
затем удалит все разделы, которые не были использованы. Возможно, каждый объектный файл содержит свои собственные разделы, даже если все функции в нем разделяют один раздел. В этом случае только флаг компоновщика должен делать то, о чем вы просите: устранить целые объекты, которые не используются. В руководстве gcc указано, что флаги компилятора увеличат размер объекта, и, хотя я надеюсь, что этот окончательный исполняемый файл не будет затронут этим, я не знаю точно, поэтому вы должны дать LDFLAGS="-Wl,--gc-sections
сам по себе попробовать в любом случае ,
Указанные имена опций могут быть полезными ключевыми словами для поиска в stackoverflow для других предложений о том, как уменьшить размер двоичного файла. gc-sections
, например. дает 62 совпадения на данный момент.
AFAIK ld должен связываться только с функциями, которые фактически используются f. Sidenote: вы используете -O-оптимизацию? – dbrank0
Да, сейчас он полностью перевернулся до -O3. Я не понимаю, почему ld будет использовать дополнительный код, но когда я разбил одну из более крупных библиотек, это значительно уменьшило размер двоичного кода. –
Используйте 'nm -a' в результирующем исполняемом файле. В нем будут перечислены символы отладки, включая имена * исходных * файлов. –