Как сжатая информация отладки проходит между ассемблером и компоновщиком при различных комбинациях флагов сжатия информации отладки? - PullRequest
0 голосов
/ 09 апреля 2020

В g cc и binutils есть несколько флагов, касающихся сжатия отладочной информации. Здесь меня интересует взаимодействие между следующими четырьмя флагами в стандартном проекте C ++, который создает несколько объектных файлов с помощью компилятора, а затем использует компилятор для создания шага ссылки, который объединяет объектные файлы в различные конечные двоичные файлы. :

  • -Wa,--compress-debug-sections=zlib-gabi
  • -Wa,--nocompress-debug-sections
  • -Wl,--compress-debug-sections=zlib-gabi
  • -Wl,--compress-debug-sections=none

Итак Мы можем представить четыре варианта. Мы скомпилировали наши объектные файлы без сжатия в ассемблере или с помощью -Wa,--compress-debug-sections=zlib-gabi, и мы связали наши объектные файлы в двоичные файлы без сжатия в компоновщике или с включенной -Wl,--compress-debug-sections=zlib-gabi.

Комбинация -Wa,--nocompress-debug-sections для компиляции и -Wl,--compress-debug-sections=none неинтересно. Предположительно никакого сжатия вообще не происходит.

Следующие две комбинации несколько более интересны:

  • С -Wa,--compress-debug-sections=zlib-gabi для ассемблера и -Wl,--compress-debug-sections=none для компоновщика, Похоже, что компоновщику потребуется время, чтобы распаковать отладочную информацию из каждого объектного файла, прежде чем объединять ее и создавать новые несжатые разделы отладочной информации для конечных двоичных файлов.

  • С -Wa,--nocompress-debug-sections для ассемблера и -Wl,--compress-debug-sections=zlib-gabi для компоновщика, очевидно, что ассемблер не будет тратить время на сжатие отладочной информации для объектных файлов, а компоновщик будет тратить время на сжатие окончательных объединенных разделов отладочной информации.

Являются ли мои предположения и понимание этих двух случаев в основном правильными? Если нет, то что я неправильно понял?

Это оставляет самый интересный случай:

  • С -Wa,--compress-debug-sections=zlib-gabi ассемблеру И -Wl,--compress-debug-sections=zlib-gabi компоновщику, что здесь происходит? Если мое понимание приведенных выше случаев правильное, я ожидаю, что ассемблер выполнит работу по сжатию отладочной информации в каждом объектном файле, а затем компоновщику потребуется потратить время на его распаковку, затем выполнить слияние и, наконец, повторно сжать объединенные разделы отладочной информации. Это верно? Или компоновщик каким-то образом может волшебным образом напрямую объединить разделы сжатой информации об отладке в объектных файлах непосредственно в заключительные разделы сжатой информации об отладке для шага ссылки, избегая цикла распаковки / повторного сжатия?

В целом, Я просто смотрю, чтобы понять, что я должен по умолчанию эти флаги в системе сборки для лучшей производительности сборки. Я, конечно, проведу некоторые тесты, но мне интересно понять и теорию работы здесь, так как это поможет мне понять любые результаты тестов сборки для этих флагов.

...