G CC Linker: как создать отчет о вкладе каждого файла в выходные секции - PullRequest
1 голос
/ 26 марта 2020

Недавно я столкнулся с проблемой при попытке связать мою программу. Это сообщение .text не может поместиться в указанной области памяти. Очевидно, что исходный код становится слишком большим, чтобы его можно было связать в ограниченной области памяти.

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

  • nm -s output.elf дает размер каждого символа, но не группируйте символ под каждым исходным файлом.
  • nm -s file.obj go через каждый объектный файл не работает, потому что указано -fdata-section -ffunction-section -Wl, поэтому не все содержимое в объектном файле будет связано с окончательным выводом
  • readelf -s output.elf дает информацию из файл в файл, но это просто список символов под каждым файлом и их размер. Сценарий может быть написан для суммирования всего размера в файле, но общее значение кажется неправильным, очевидная ошибка здесь - некоторые символы могут указывать на одну и ту же область памяти, поэтому одна и та же область памяти может быть вычислена много раз.

Когда ссылка g cc выполняет свою работу, она должна знать все детали того, что извлечено из объектного файла и помещено в секцию вывода, но, похоже, она не предоставляет переключателя для генерации детали. отчет (или я что-то упустил?)

Есть ли какой-нибудь инструмент, который может выполнить эту работу?

1 Ответ

1 голос
/ 27 марта 2020

Возможно --gc-sections вместе с --print-gc-sections и / или --print-map-discarded?

Если все находится в отдельных разделах, то у вас есть все разделы в качестве входных данных и список удаленных разделов. Затем простой скрипт выдаст список используемых разделов, их размер и отображение файла.

...