Эм... В заголовок? У меня Debug Data после IAT. Формата Debug Data не знаю, но ещё после таблицы импорта идёт какая-то атрибутика и собственно путь.
В детали PE лезть лень, а в HEX редакторе ничего похожего на пути не вижу. Отладочная инфа разрешена, pdb нормально генерируется. Размер exe от запрета не меняется.
А кстати, кто знает - зачем студия по умолчанию цепляет манифест? Для XP контролов он всё равно не годится - нужен другой. В качестве шаблона тоже - создается при компиляции, а не при генерации проекта.
да, манифест - фейл. вся студия после выхода vc6 является огромным фейлом. демотиватор нарисовал бы, но это уже будет пошло.
А разобрался - он чтобы CRT из dll нормально цеплялся, соответственно при компиляции с /MT или без CRT бесполезен. А манифест для XP это отдельная история он цепляется и при отключенной генерации манифеста в опциях линкера.
Вот мы тоже удивлялись, когда однажды в проекте, собранном со статической CRT, обнаружили студийный манифест для длл. Из-за этого на системах без студийных длл'ок такое приложения по идее не стало бы запускаться. Оказалось, что в файле <crtdefs.h>, который включён в кучу библиотек, есть такие строчки: Код (Text): ... #if !defined(_CRT_FORCE_MANIFEST) && defined(_VC_NODEFAULTLIB) #define _CRT_NOFORCE_MANIFEST #endif ... #include <crtassem.h> ... #if !defined(_CRT_NOFORCE_MANIFEST) #ifdef _M_IX86 #ifdef _DEBUG #pragma comment(linker,"/manifestdependency:\"type='win32' " \ "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".DebugCRT' " \ "version='" _CRT_ASSEMBLY_VERSION "' " \ "processorArchitecture='x86' " \ "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"") #else #pragma comment(linker,"/manifestdependency:\"type='win32' " \ "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".CRT' " \ "version='" _CRT_ASSEMBLY_VERSION "' " \ "processorArchitecture='x86' " \ "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"") #endif #endif /* _M_IX86 */ #ifdef _M_AMD64 .... crtassem.h: #define __LIBRARIES_ASSEMBLY_NAME_PREFIX "Microsoft.VC90" #define _VC_ASSEMBLY_PUBLICKEYTOKEN "1fc8b3b9a1e18e3b" #define _CRT_ASSEMBLY_VERSION "9.0.21022.8" Кстати, удобный способ цеплять манифест для стилей: Код (Text): // // styles.h // // Include this file // @ // Enable Visual Styles Support // #pragma once #pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' "\ "version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") Если момент — физический размер секций не обязательно должен быть кратен 200h (в PE спецификации сказано иное хотя). В винде можно использовать меньшее значение — в этом случае и размер файла можно будет уменьшить. Правда, линкер от МС этого делать не умеет (впрочем, этому его несложно научить, также как и объединению "необъединяемых" секций .
Sol_Ksacap Ну во-первых, 2,5 КБ кратно 200h. Во-вторых, никто ж не спорит, что возможно меньше. Можно вообще без секций. Но, как Вы правильно заметили, "линкер от МС этого делать не умеет". А странновато, т.к. непонятно, что туда линкер у Y_Mur напихал. Если не объединять секции, то у меня 2 КБ и сплошные пустоты. А где они необъединямые? Они объединяются. В результате exe занимает 1 КБ. И, кстати, в нём остаётся ещё полно места.
драстье. с какого перепугу линкер от мс этого не умеет? минимальный раземер exe, собираемого ms link - полкило. это это без всяких хаков. и он работает на любой NT.
kaspersky Полкилобайта всё ещё кратно 200h. P.S. Хотя... каким образом получается PE размером в 512 байт? 512 на заголовок и 512 на единственную секцию. Как сделать ещё меньше "без всяких хаков"?
Глянул в olli - оказывается соврал ) система после retn не выбрасывает eax, а передаёт его в ExitTread, так что можно без CRT возвращать код завершения как return xxx;. Впрочем просто return; там всё равно компилируется как return 0, даже если void main(void). Разглядел повнимательнее - действительно путь появляется/исчезает при разрешении/запрете pdb, но размер не меняется, может express линкер такой "особенный" впрочем для меня это не существенно
На некоторые имена секций наложен запрет (лайк, "выглядит так, будто ты пытаешься сделать что-то с 'особой' секцией. Просто чтобы быть в безопасности, мы не будем линковать этот беспорядок"). Среди таких секций — .pdata (информация об исключениях для x64),.. Ээ, не помню, какие ещё секции. Выглядит лайк, мы неясно сформулировали мысль — в прошлом посте мы лишь хотели сказать, что ms link не умеет выставлять секциям физический размер меньше 200h. Кстати, насчёт совместимости у таких (Sections.PhysicalSize < 200h) экзешников — везде не проверяли, мб на 2k или NT4 не будет работать. Решили попробовать собрать HelloWorld без секций. (HelloWorld-payload в dos-стабе). Без хаков. Пока что добились падения линкера на финальной стадии сборки; если позволить внешним силам вмешаться и помешать падению, то собирается файл 424б (what?), при попытке просмотреть который с помощью CFF Explorer намертво виснет уже CFF Explorer. Это нас весьма позабавило. Сейчас ещё попытаемся — должны быть дополнительные варианты.