Ключи компоновщика

Тема в разделе "WASM.BEGINNERS", создана пользователем Mikl___, 21 фев 2022.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.395
    нашел в книге Джеффри Рихтера «Windows. Создание эффективных Win32-приложений с учетом специфики 64-разрядных версий Windows» следующие строки
    ...не многие знают, что в проекте можно вообще не указывать ключ /SUBSYSTEM компоновщика... компоновщик сам определит подсистему Вашего приложения, если проверит, какая из четырех функций (WinMain, wWinMain, main или wmain) присутствует в Вашем коде, и на основании этого выберет подсистему...
    Тип приложенияВходная
    функция
    ключ компоновщика
    GUI-приложениеработающее с ANSI-символами и строкамиWinMain/SUBSYSTEM:WINDOWS
    работающее с Unicode-символами и строкамиwWinMain
    консольное
    приложение
    работающее с ANSI-символами и строкамиmain/SUBSYSTEM:CONSOLE
    работающее с Unicode-символами и строкамиwmain
    bat-файл, который может собрать и CONSOLE- и GUI-приложения
    Код (Text):
    1. cls
    2. set masm64_path=C:\masm64\ <-- название вашего каталога
    3. set filename= . . . <-- название вашего файла
    4. if exist errors.txt del errors.txt
    5. if exist %filename%.exe del %filename%.exe
    6. %masm64_path%bin\ml64 /Cp /c /I"%masm64_path%Include" %filename%.asm >> errors.txt
    7. if errorlevel 1 exit
    8. :CONSOLE
    9. %masm64_path%bin\link /LIBPATH:"%masm64_path%Lib" /entry:main  >> errors.txt
    10. if errorlevel 1120 goto GUI
    11. if errorlevel 1 exit
    12. goto exit0
    13. :GUI
    14. %masm64_path%bin\link /LIBPATH:"%masm64_path%Lib" /entry:WinMain >> errors.txt
    15. if errorlevel 1 exit
    16. :exit0
    17. if exist errors.txt del errors.txt <-- убираем "программный мусор"
    18. if exist %filename%.obj del %filename%.obj
     
    DOSAsm386 и Aiks нравится это.
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.416
    Простите, но это больше похоже на вредные советы. Или легаси из времён вин98.
    Для x64 систем MS рекомендует (и их компоновщик по умолчанию ставит) базу 0x100000000 для EXE и 0x180000000 для DLL.
    Кастомная DOS-заглушка на x64 - ну разве что "цопирайт" свой воткнуть.
    Секция кода с разрешённой записью? O_O
    Объединение секций кода и readonly-данных, учитывая предыдущий ключ - зачем тогда вообще rdata?
    Принудительно оставлять образ без релоков (/fixed) предполагая запуск на 64-битной Vista+ с ASLR - ну разве что сэкономить пару сотен байт?
    Имхо, если задача не поиграться с собственным кодом в отладчике, то ни один из этих ключей лучше не применять.
     
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.395
    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-приложение
    Ну хорошо, я уберу эти ключи из учебного примера...
     
  4. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.416
    Дык с этим я и не спорю, однако в тексте предлагаемого батника не только про SUBSYSTEM, не так ли?
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.395
    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
     
  6. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    269
    Интересно, никто не знает почему?
    Для 32-бит легко гуглится ( https://devblogs.microsoft.com/oldnewthing/20141003-00/?p=43923 ), что это легаси из Windows 95 с освобождением первого мегабайта для виртуального режима x86, плюс для простоты реализации переключения контекстов Win 3.11 там есть округление до 4Мб.
    Но тут то зачем?
     
    Mikl___ нравится это.
  7. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.416
    My bad, опечатался.
     
    Mikl___ нравится это.