2012-05-14 3 views
1

Немного фона: Я пытаюсь построить двоичный файл AVR для встроенной сенсорной системы, и я бегу близко к моему размеру. Я использую несколько внешних библиотек, чтобы помочь мне, но они довольно большие, когда они скомпилированы в один объект для каждой библиотеки. Я хочу потянуть их на более мелкие объекты, поэтому только моя функциональность связана с моей программой. Мне уже удалось сбросить бинарный размер на 2k, разделив большую библиотеку.Может ли GNU ld быть проинструктирован о печати каких файлов .o во время ссылки?

Это поможет много узнать, какие объекты используются на каждом этапе игры, чтобы я мог более эффективно их разделять. Есть ли способ сделать ld печать, какие объекты он связывает?

+0

AFAIK ld должен связываться только с функциями, которые фактически используются f. Sidenote: вы используете -O-оптимизацию? – dbrank0

+0

Да, сейчас он полностью перевернулся до -O3. Я не понимаю, почему ld будет использовать дополнительный код, но когда я разбил одну из более крупных библиотек, это значительно уменьшило размер двоичного кода. –

+3

Используйте 'nm -a' в результирующем исполняемом файле. В нем будут перечислены символы отладки, включая имена * исходных * файлов. –

ответ

0

Я не уверен, о объекта уровне, но я полагаю, вы могли бы быть в состоянии решить это на символ уровне с использованием CFLAGS="-fdata-sections -ffunction-sections" и LDFLAGS="-Wl,--gc-sections -Wl,--print-gc-sections". Это должно избавиться от кода для всех непринятых символов и отобразить удаленные символы для вас, что может быть полезно, если по какой-то причине вы решите вернуться на уровень объектных файлов и хотите идентифицировать объектные файлы, содержащие только удаленные символы.

Чтобы быть более точным, указанные множители компилятора запросят компилятор для размещения каждой функции или глобальной переменной в разделе для себя, а флаг компоновщика --gc-sections затем удалит все разделы, которые не были использованы. Возможно, каждый объектный файл содержит свои собственные разделы, даже если все функции в нем разделяют один раздел. В этом случае только флаг компоновщика должен делать то, о чем вы просите: устранить целые объекты, которые не используются. В руководстве gcc указано, что флаги компилятора увеличат размер объекта, и, хотя я надеюсь, что этот окончательный исполняемый файл не будет затронут этим, я не знаю точно, поэтому вы должны дать LDFLAGS="-Wl,--gc-sections сам по себе попробовать в любом случае ,

Указанные имена опций могут быть полезными ключевыми словами для поиска в stackoverflow для других предложений о том, как уменьшить размер двоичного файла. gc-sections, например. дает 62 совпадения на данный момент.