В 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
компоновщику, что здесь происходит? Если мое понимание приведенных выше случаев правильное, я ожидаю, что ассемблер выполнит работу по сжатию отладочной информации в каждом объектном файле, а затем компоновщику потребуется потратить время на его распаковку, затем выполнить слияние и, наконец, повторно сжать объединенные разделы отладочной информации. Это верно? Или компоновщик каким-то образом может волшебным образом напрямую объединить разделы сжатой информации об отладке в объектных файлах непосредственно в заключительные разделы сжатой информации об отладке для шага ссылки, избегая цикла распаковки / повторного сжатия?
В целом, Я просто смотрю, чтобы понять, что я должен по умолчанию эти флаги в системе сборки для лучшей производительности сборки. Я, конечно, проведу некоторые тесты, но мне интересно понять и теорию работы здесь, так как это поможет мне понять любые результаты тестов сборки для этих флагов.