нашел в книге Джеффри Рихтера «Windows. Создание эффективных Win32-приложений с учетом специфики 64-разрядных версий Windows» следующие строки ...не многие знают, что в проекте можно вообще не указывать ключ /SUBSYSTEM компоновщика... компоновщик сам определит подсистему Вашего приложения, если проверит, какая из четырех функций (WinMain, wWinMain, main или wmain) присутствует в Вашем коде, и на основании этого выберет подсистему... Тип приложенияВходная функцияключ компоновщикаGUI-приложениеработающее с ANSI-символами и строкамиWinMain/SUBSYSTEM:WINDOWSработающее с Unicode-символами и строкамиwWinMainконсольное приложениеработающее с ANSI-символами и строкамиmain/SUBSYSTEM:CONSOLEработающее с Unicode-символами и строкамиwmainbat-файл, который может собрать и CONSOLE- и GUI-приложения Code (Text): cls set masm64_path=C:\masm64\ <-- название вашего каталога set filename= . . . <-- название вашего файла if exist errors.txt del errors.txt if exist %filename%.exe del %filename%.exe %masm64_path%bin\ml64 /Cp /c /I"%masm64_path%Include" %filename%.asm >> errors.txt if errorlevel 1 exit :CONSOLE %masm64_path%bin\link /LIBPATH:"%masm64_path%Lib" /entry:main >> errors.txt if errorlevel 1120 goto GUI if errorlevel 1 exit goto exit0 :GUI %masm64_path%bin\link /LIBPATH:"%masm64_path%Lib" /entry:WinMain >> errors.txt if errorlevel 1 exit :exit0 if exist errors.txt del errors.txt <-- убираем "программный мусор" if exist %filename%.obj del %filename%.obj
Простите, но это больше похоже на вредные советы. Или легаси из времён вин98. Для x64 систем MS рекомендует (и их компоновщик по умолчанию ставит) базу 0x100000000 для EXE и 0x180000000 для DLL. Кастомная DOS-заглушка на x64 - ну разве что "цопирайт" свой воткнуть. Секция кода с разрешённой записью? O_O Объединение секций кода и readonly-данных, учитывая предыдущий ключ - зачем тогда вообще rdata? Принудительно оставлять образ без релоков (/fixed) предполагая запуск на 64-битной Vista+ с ASLR - ну разве что сэкономить пару сотен байт? Имхо, если задача не поиграться с собственным кодом в отладчике, то ни один из этих ключей лучше не применять.
RamMerLabs, не стоило так близко к сердцу принимать мой рабочий bat-файл с ключами /LARGEADDRESSAWARE:NO /BASE:0x400000 /STUB:%masm64_path%bin\stubby.exe /SECTION:.text,W /ALIGN:16 /MERGE:.rdata=.text суть в том что при /entry:main (если такая входная метка есть) ― будет создано консольное приложение, если такой метки нет (errorlevel возвращается с кодом 1120) ― значит входная метка WinMain и будет создано GUI-приложение Ну хорошо, я уберу эти ключи из учебного примера...
RamMerLabs, The default base address for an .exe file is 0x400000 for 32-bit images or 0x140000000 for 64-bit images. For a DLL, the default base address is 0x10000000 for 32-bit images or 0x180000000 for 64-bit images
Интересно, никто не знает почему? Для 32-бит легко гуглится ( https://devblogs.microsoft.com/oldnewthing/20141003-00/?p=43923 ), что это легаси из Windows 95 с освобождением первого мегабайта для виртуального режима x86, плюс для простоты реализации переключения контекстов Win 3.11 там есть округление до 4Мб. Но тут то зачем?