ничего лишнего

Тема в разделе "LANGS.C", создана пользователем spencer, 5 июл 2007.

  1. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    решился я как то переходить постепенно на си++. А то куда не глянь все о нем спрашивают, да и признать быстрее кой чего писать на нем. Использую MS VS 2005/ Начал кодить значит. И вижу что есть там две версии настроек сборки - debug & release. Дэбаг получается больше но зато в ольке видны строчки из сорса. Значит по назначению его и использую, для дебага тобишь. А вот с релизом я жутко разочаровался. Создаю пустой вин проджект. Весь код таков:
    Код (Text):
    1. #include <windows.h>
    2.  
    3. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,  int nCmdShow)
    4. {  
    5.     return 0;}
    и компилится это чудо в 5 с лишним килобайт. Помимио того оно имеет кучу обращений к MSVCR80.dll:
    365 _encode_pointer
    230 __set_app_type
    1005 _unlock
    151 __dllonexit
    636 _lock
    208 __p__fmode
    355 _decode_pointer
    374 _except_handler4_common
    529 _invoke_watson
    322 _controlfp_s
    334 _crt_debugger_hook
    204 __p__commode
    273 _adjust_fdiv
    233 __setusermatherr
    319 _configthreadlocale
    523 _initterm_e
    522 _initterm
    259 _acmdln
    1238 exit
    555 _ismbblead
    103 _XcptFilter
    383 _exit
    303 _cexit
    160 __getmainargs
    802 _onexit
    280 _amsg_exit

    Помимо того в конце какойто код которого я как творец не предусматривал:

    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <dependency>
    <dependentAssembly>
    <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
    </dependency>
    </assembly>PAPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADD

    помимо того там еще.. и еще и еще..
    собираю его без дэфолтных либ. Произво млин. У меня чувство творца вмиг пропало.
    Вот и созрел вопрос который потому и разместил на этом форуме что понимаете вы того кто на асме писал доселе. Как же мне получить на выходе то ровно что я в исходнике то написал. Ведь можно же и тут как то указать что то вроде /align:16 и /merge:.rdata=.data. Мжно же как то указывать из исходника какие либы подключать (чтото вроде includelib).
    Я спрашивал по этому поводу мне отвечали мл - тебе 5Кб жмут что ли. Но чёрт не могу я продолжать работь зная что где то в самом начале у меня что то пропущено, что студия лепит туда столько всего непрошенного что про свободный просмотр в дэбагере можно и забыть...
    Я понмиаю что стиль работы тут вовсе другой. Однако слишком уж не охота зацыкливатся на этом всем. Хотелось бы писать на чистом WinAPI, используя левые либы лишь в случае когда увиу их превосходство или незаменимость и так учится постепенно. Подскажите пожалуйста кто чего знает...
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    spencer
    А чего бы ты хотел - среда универсальная, заточена под все возможные варианты, что влечет потерю в эффективности. Потеря на самом деле кажущаяся, в большом проекте инициализация среды будет копеечной по сравнению со всем остальным кодом. А для приведенного тобой примера лучше конечно писать на голом ассемблере.
     
  3. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    все же на данном этапе мне нужно более сосредоточится на воплощении идеи в код для чего си удобней, пишется быстрей и наглядней, да чего там говорить. И мне трудно верится что там не предусмотренны какие то хитрые опции...
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    spencer
    настраивай проект через Опции, чтоб было похоже на это и будет все шоколадно
    Код (Text):
    1. <?xml version="1.0" encoding="windows-1251"?>
    2. <VisualStudioProject
    3.     ProjectType="Visual C++"
    4.     Version="8,00"
    5.     Name="HideDebugger"
    6.     ProjectGUID="{4FB2D9A5-32D8-4ADE-B1DC-E543003EA1C6}"
    7.     RootNamespace="HideDebugger"
    8.     Keyword="Win32Proj"
    9.     >
    10.     <Platforms>
    11.         <Platform
    12.             Name="Win32"
    13.         />
    14.     </Platforms>
    15.     <ToolFiles>
    16.     </ToolFiles>
    17.     <Configurations>
    18.         <Configuration
    19.             Name="Debug|Win32"
    20.             OutputDirectory="$(SolutionDir)$(ConfigurationName)"
    21.             IntermediateDirectory="$(ConfigurationName)"
    22.             ConfigurationType="2"
    23.             CharacterSet="0"
    24.             >
    25.             <Tool
    26.                 Name="VCPreBuildEventTool"
    27.             />
    28.             <Tool
    29.                 Name="VCCustomBuildTool"
    30.             />
    31.             <Tool
    32.                 Name="VCXMLDataGeneratorTool"
    33.             />
    34.             <Tool
    35.                 Name="VCWebServiceProxyGeneratorTool"
    36.             />
    37.             <Tool
    38.                 Name="VCMIDLTool"
    39.             />
    40.             <Tool
    41.                 Name="VCCLCompilerTool"
    42.                 Optimization="0"
    43.                 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;HIDEDEBUGGER_EXPORTS"
    44.                 MinimalRebuild="true"
    45.                 BasicRuntimeChecks="3"
    46.                 RuntimeLibrary="3"
    47.                 StructMemberAlignment="1"
    48.                 DefaultCharIsUnsigned="true"
    49.                 UsePrecompiledHeader="0"
    50.                 WarningLevel="3"
    51.                 Detect64BitPortabilityProblems="false"
    52.                 DebugInformationFormat="4"
    53.             />
    54.             <Tool
    55.                 Name="VCManagedResourceCompilerTool"
    56.             />
    57.             <Tool
    58.                 Name="VCResourceCompilerTool"
    59.             />
    60.             <Tool
    61.                 Name="VCPreLinkEventTool"
    62.             />
    63.             <Tool
    64.                 Name="VCLinkerTool"
    65.                 LinkIncremental="2"
    66.                 GenerateManifest="false"
    67.                 GenerateDebugInformation="true"
    68.                 SubSystem="2"
    69.                 TargetMachine="1"
    70.             />
    71.             <Tool
    72.                 Name="VCALinkTool"
    73.             />
    74.             <Tool
    75.                 Name="VCManifestTool"
    76.             />
    77.             <Tool
    78.                 Name="VCXDCMakeTool"
    79.             />
    80.             <Tool
    81.                 Name="VCBscMakeTool"
    82.             />
    83.             <Tool
    84.                 Name="VCFxCopTool"
    85.             />
    86.             <Tool
    87.                 Name="VCAppVerifierTool"
    88.             />
    89.             <Tool
    90.                 Name="VCWebDeploymentTool"
    91.             />
    92.             <Tool
    93.                 Name="VCPostBuildEventTool"
    94.             />
    95.         </Configuration>
    96.         <Configuration
    97.             Name="Release|Win32"
    98.             OutputDirectory="$(SolutionDir)$(ConfigurationName)"
    99.             IntermediateDirectory="$(ConfigurationName)"
    100.             ConfigurationType="2"
    101.             CharacterSet="0"
    102.             WholeProgramOptimization="1"
    103.             >
    104.             <Tool
    105.                 Name="VCPreBuildEventTool"
    106.             />
    107.             <Tool
    108.                 Name="VCCustomBuildTool"
    109.             />
    110.             <Tool
    111.                 Name="VCXMLDataGeneratorTool"
    112.             />
    113.             <Tool
    114.                 Name="VCWebServiceProxyGeneratorTool"
    115.             />
    116.             <Tool
    117.                 Name="VCMIDLTool"
    118.             />
    119.             <Tool
    120.                 Name="VCCLCompilerTool"
    121.                 InlineFunctionExpansion="0"
    122.                 EnableIntrinsicFunctions="false"
    123.                 WholeProgramOptimization="false"
    124.                 PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;HIDEDEBUGGER_EXPORTS"
    125.                 ExceptionHandling="1"
    126.                 RuntimeLibrary="0"
    127.                 StructMemberAlignment="1"
    128.                 BufferSecurityCheck="false"
    129.                 DefaultCharIsUnsigned="true"
    130.                 UsePrecompiledHeader="0"
    131.                 AssemblerOutput="1"
    132.                 WarningLevel="3"
    133.                 Detect64BitPortabilityProblems="false"
    134.                 DebugInformationFormat="3"
    135.             />
    136.             <Tool
    137.                 Name="VCManagedResourceCompilerTool"
    138.             />
    139.             <Tool
    140.                 Name="VCResourceCompilerTool"
    141.             />
    142.             <Tool
    143.                 Name="VCPreLinkEventTool"
    144.             />
    145.             <Tool
    146.                 Name="VCLinkerTool"
    147.                 AdditionalOptions="/SAFESEH:NO"
    148.                 LinkIncremental="1"
    149.                 GenerateManifest="false"
    150.                 IgnoreAllDefaultLibraries="true"
    151.                 GenerateDebugInformation="false"
    152.                 SubSystem="2"
    153.                 OptimizeReferences="2"
    154.                 EnableCOMDATFolding="2"
    155.                 OptimizeForWindows98="1"
    156.                 LinkTimeCodeGeneration="0"
    157.                 TargetMachine="1"
    158.             />
    159.             <Tool
    160.                 Name="VCALinkTool"
    161.             />
    162.             <Tool
    163.                 Name="VCManifestTool"
    164.             />
    165.             <Tool
    166.                 Name="VCXDCMakeTool"
    167.             />
    168.             <Tool
    169.                 Name="VCBscMakeTool"
    170.             />
    171.             <Tool
    172.                 Name="VCFxCopTool"
    173.             />
    174.             <Tool
    175.                 Name="VCAppVerifierTool"
    176.             />
    177.             <Tool
    178.                 Name="VCWebDeploymentTool"
    179.             />
    180.             <Tool
    181.                 Name="VCPostBuildEventTool"
    182.             />
    183.         </Configuration>
    184.     </Configurations>
    185.     <References>
    186.     </References>
    187.     <Files>
    188.         <Filter
    189.             Name="Source Files"
    190.             Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
    191.             UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
    192.             >
    193.             <File
    194.                 RelativePath=".\HideDebugger.cpp"
    195.                 >
    196.             </File>
    197.         </Filter>
    198.         <Filter
    199.             Name="Header Files"
    200.             Filter="h;hpp;hxx;hm;inl;inc;xsd"
    201.             UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
    202.             >
    203.             <File
    204.                 RelativePath=".\HideDebugger.h"
    205.                 >
    206.             </File>
    207.         </Filter>
    208.         <Filter
    209.             Name="Resource Files"
    210.             Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
    211.             UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
    212.             >
    213.             <File
    214.                 RelativePath=".\HideDebugger.rc"
    215.                 >
    216.             </File>
    217.         </Filter>
    218.         <File
    219.             RelativePath=".\exsup.lib"
    220.             >
    221.         </File>
    222.         <File
    223.             RelativePath=".\OLLYDBG.LIB"
    224.             >
    225.         </File>
    226.     </Files>
    227.     <Globals>
    228.     </Globals>
    229. </VisualStudioProject>
     
  5. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Asterix
    А в чем изюмина?
     
  6. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    ага, это файл настроек проэкта насколько я понимаю? Нашел три файла с подобным синтаксисом
    WinMain.vcproj.SET.Admin.user
    WinMain.vcproj
    WinMain.exe.intermediate.manifest
    какой из них должен быть изменен? Что это за файлы я плохо себе представляю пока...
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    WinMain.vcproj но изменять лучше не вручную а через опции проекта

    в том что нужно настроить проект, отключить манифесты и прочая прочая :)
     
  8. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    вобщем я создал отдельную папку, создал там файл 11.vcproj и записал в него твой код. Потом запустил его. Как я понял это файл настроек проэкта. ОТкрылась студия. Я увидел что ему нужен HideDebugger.cpp и создал его
    Код (Text):
    1. #include <windows.h>
    2.  
    3. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,  int nCmdShow)
    4. {  
    5.     return 0;}
    откомпилилось отлично да только где теперь экзэшник новоспечённый искать непойму это раз и вот еще с чем немогу справится - разве эти настройки не разные для debug b release?
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    spencer
    а это проект для DLL ;)
    Я не говорил что твой файл проекта должен быть в точности таким же

    Для экзешника нужно переобозначить точку входа
    #pragma comment(linker, "/ENTRY:start")

    и вместо main юзать
    void start()
    {
    .................
    ExitProcess(0);
    }

    рантайм библу можно не отключать, если юзать некоторый ограниченный набор функций
    оттуда, например строковые, то это не особо увеличивает размер
     
  10. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    разные, настройки для Debug почти по дефолту, кроме специфических которые
    требует OllyDbg при компиляции плагинов
     
  11. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    да, это оно, спасибо тебе огромаднейшее....
     
  12. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    http://rsdn.ru/article/cpp/crt.xml
     
  13. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    еще на uinc есть статья, но мне на gprs было лень искать :)
     
  14. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Ну зачем для проектов в 100-200 строк использовать такие масштабные профессиональные комплексы разработки? В данном случае и 1% возможностей не задействовано. Да кому мешают 2-3кб в современном мире? Троянописателям только.
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Основные причины большого веса пустой проги собранной со стандартными опциями:
    1) Точка входа реально не WinMain, а WinMainCRTStartup. Ты думаешь, кто передает тебе параметры hInstance, hPrevInstance, lpCmdLine, nShowCmd? WinMainCRTStartup вызывает GetModuleHandleA, GetStartupInfo, GetCommandLineA, производит еще кучу действий, а уж потом вызывает WinMain. Изза этой кучи действий появляется "лишний" импорт из CRT. Не нравится - пиши /ENTRY:WinMain, только никаких аргументов её юзать будет нельзя и все получать вручную
    2) Статическая линковка CRT. Не нравится - пиши /NODEFAULTLIB и линкуй с MSVCRT.LIB. Только придется таскать за собой DLL для тех, у кого её нету (хотя она есть почти везде).
    3) Выравнивание секций на диске. Не нравится большое выравнивание - пиши /ALIGN:32 или какое-нибудь подобное маленькое. Минусы - если у тебя в файле несколько секций таких "маленьких", загрузчик при запуске пихнет их всех на одну страницу памяти (если влезет, конечно) и будут глюки с доступом. Хочется, чтобы секции друг друга не трогали - оставь выравнивание 4к
    4) Можно совместить секции /MERGE:.data=.text и проч, только могут быть потом лаги по этому поводу, тут нужно действовать аккуратно.

    Вроде все..

    ЗЫ.
    Это манифест называется. Используется для более аккуратного удовлетворения зависимостей. Отключается в опциях если не нужен
     
  16. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    что это за CRT?
     
  17. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    /SECTION .merged,RWE

    В связи с производительностью? Или что-то иное?
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    spencer
    C Runtime Library, он же просто рантайм. В Visual C++ этим заведует msvcrt.dll, msvcrВЕРСИЯ.dll, а так же статические libc*.lib. В никсах у гцц это libc.a.

    IceStudent
    Я не про объединение, а про сокращение выравнивания. Придется всем секциям, которые окажутся на одной странице, выставлять максимальные права. Я помню делал дллку, решил тоже - ну нафиг выравнивание 4к, 32 байт вполне хватит. А там была секция только для чтения одна. Я хз, что сделал линкер, но в итоге после загрузки DLL в память вся страница, где была эта секция и соседние, оказась с атрибутом PAGE_READONLY. В результате обращение к соседней секции на той же странице падало, хотя на диске ее атрибуты были RW. Так что если и снижать выравнивание секций, то смотреть как будут лежать секции в памяти и как использоваться, чтобы выдать им нужные права..
    Либо надо както указать линкеру принудительно желаемый RVA для секции. В линкере от MS я хз как это сделать.

    не помню=\
     
  19. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Написание экстра-маленьких Win32 приложений на С++ от 1 КБ
    http://uinc.ru/articles/28/

    и вот, в архиве http://dssoft.org.ua/Tiny.zip примеры проэктов приложений Win32 на 2КБ, MFC на 9КБ.
     
  20. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    RWE: read|write|executable.

    Вот это странно и быть не должно, имхо.