Сегодня обнаружил в MS VS/VC забавный глюк. Если указать компилятору ключ /GL (link-time code generation), то ключи /FAs, /FAc, /FAsc перестают создавать ассемблерные листинги. Наблюдается с компиляторами с 13.00 до 19.28 (из последней VS 2019). Логика этого совершенно непонятна, но вот так.
Но, если компилятор запускается из-под студии, то в конфигурациях "Application" и "DLL" ассемблерные листинги волшебным образом создаются, а вот в конфигурации "Static library" — нет. Понятно, что библиотеке LTCG, как правило, не нужно, а нередко и вредно, но я на автомате включил LTCG для всех проектов, после чего обнаружил, что листинги библиотеки перестали создаваться.
Командные строки компилятора идентичны с точностью до автоматически вставляемых студией определений вроде "/D_WINDLL". Если скопировать командную строку из лога студии и подсунуть ее CL, хоть непосредственно, хоть в RSP-файле — листинги не создаются, если присутствует /GL. Когда компилятор запускается студией с той же командной строкой — создаются.
Такое впечатление, что студия определяет какие-то переменные окружения, на которые реагирует компилятор. Вот только зачем вся эта шняга —
.
Здравствуйте, cserg, Вы писали:
C>Ну, возможно, что если LTCG включен, то объектные файлы на самом деле содержат не объектный код, а промежуточное представление компилятора.
В таком случае, что они содержат, когда компилятор запускается из-под студии, и таки создает вполне кошерные ассемблерные листинги?
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>В таком случае, что они содержат, когда компилятор запускается из-под студии, и таки создает вполне кошерные ассемблерные листинги?
Например,
здесь пишут следующее:
Well, things are actually quite simple. When you build a translation unit the frontend translates the translation unit into a high-level intermediate representation. Typically, several compiler phases lowering the IR until it is eventually written to a COFF object file. When you build a translation unit with /GL, the compiler simply dumps the IR to disk (I'm not sure how this is handled in VC++, but IRs are typically quite complex and versioning is a bit of a pain so you sometimes simply tie it to the build number).
Я сам это не проверял. Лень.
Здравствуйте, cserg, Вы писали:
C>Например, здесь пишут
Это все понятно. Но вряд ли ребята из MS всерьез полагали, что кто-то, включив LTCG, возжелает затем использовать ассемблерные листинги для побайтного сравнения кода.
В них ведь есть и другая информация, которая может помочь при контроле/отладке.