Проблема с /NODEFAULTLIB в VS2005

Тема в разделе "WASM.BEGINNERS", создана пользователем lammer_222, 11 май 2009.

  1. lammer_222

    lammer_222 New Member

    Публикаций:
    0
    Регистрация:
    11 май 2009
    Сообщения:
    15
    Проблема в следующем:
    с помощью #pragma comment(linker,"/NODEFAULTLIB") отключаю все библиотеки по умолчанию. (нужно приложение на чистом апи, минимльного размера)

    Все хорошо, но могу использовать конструкции try/catch
    Помогите плиз, долблюсь уже 3 часа
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ну ты сам и ответил - не отключай ) Придется не отключать, либо писать свой __CxxFrameHandler.
    Я не знаю других вариантов.
     
  3. lammer_222

    lammer_222 New Member

    Публикаций:
    0
    Регистрация:
    11 май 2009
    Сообщения:
    15
    хм... если их отключить, то (без try catch) размер .exe ~2kb, если включить и использовать СЕХ, то уже 52кб.
    Неужели компилятор не может использовать seh без стандартных библиотек?
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Обычный сех (try/except) может, импортируя из ntdll.
    С++ные try/catch, насколько я знаю, нет.
     
  5. lammer_222

    lammer_222 New Member

    Публикаций:
    0
    Регистрация:
    11 май 2009
    Сообщения:
    15
    Опишу подробней, чего я хочу добиться:
    Вот такой код занимает 1,5кб
    Код (Text):
    1. #include <Windows.h>
    2.  
    3. #pragma comment(linker, "/SECTION:.rdata,,ALIGN:4096")
    4. #pragma comment(linker, "/SECTION:.data,,ALIGN:4096")
    5. #pragma comment(linker, "/SECTION:.text,ERW,ALIGN:4096")
    6. #pragma comment(linker, "/ALIGN:4096")
    7.  
    8. #pragma comment(linker, "/MERGE:.rdata=.text")
    9. #pragma comment(linker, "/MERGE:.data=.text")
    10. #pragma comment(linker, "/SUBSYSTEM:WINDOWS")
    11. #pragma comment(linker, "/ENTRY:NewWinMain")
    12.  
    13. void NewWinMain()
    14. {
    15. }
    Вот такой уже 42кб:
    Код (Text):
    1. ...
    2. int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
    3. {
    4. }
    А если попытаться вот так, то получаем unresolved link (LIBCMT.lib(crt0.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup):
    Код (Text):
    1. #pragma comment(linker, "/ENTRY:NewWinMain")
    2.  
    3. void NewWinMain()
    4. {
    5.    
    6.     try
    7.     {
    8.         wsprintfA(0,"fuck");
    9.     }
    10.     catch(...)
    11.     {
    12.         MessageBoxA(0,"Oooops","",0);
    13.     }
    14. }
    Как сделать последний вариант рабочим? И чтоб размер был ~2кб, я чувствую, что это реально.
     
  6. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    А ты CRT-библиотеки отключил?
     
  7. lammer_222

    lammer_222 New Member

    Публикаций:
    0
    Регистрация:
    11 май 2009
    Сообщения:
    15
    Microedition
    мммм.. как видишь нет (наверное)
     
  8. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    используйте __try/__except
    достаточно добавить в проект exsup.lib
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ответ простой - ему не хватает main().
    Определи пустую extern "C" int _cdecl main() { return 0; }

    Asterix
    Насчет try/except я уже писал.
     
  10. lammer_222

    lammer_222 New Member

    Публикаций:
    0
    Регистрация:
    11 май 2009
    Сообщения:
    15
    Great
    После этого компилится тот самый "последний вариант", но размер .exe 44кб :dntknw:
     
  11. lammer_222

    lammer_222 New Member

    Публикаций:
    0
    Регистрация:
    11 май 2009
    Сообщения:
    15
    Asterix
    exsup.lib - он вроде разный для разных осей, или нет?
     
  12. lammer_222

    lammer_222 New Member

    Публикаций:
    0
    Регистрация:
    11 май 2009
    Сообщения:
    15
    Вот такой код подвешивает проц на 100%:
    Код (Text):
    1. #pragma comment(linker, "/ENTRY:NewWinMain")
    2. #pragma comment(lib, "exsup.lib")
    3. void NewWinMain()
    4. {
    5.     __try
    6.     {
    7.         wsprintfA(0,"fuck");
    8.     }
    9.     __except(EXCEPTION_ACCESS_VIOLATION)
    10.     {
    11.         MessageBoxA(0,"Oooops","",0);
    12.     }
    13.    
    14. }
     
  13. lammer_222

    lammer_222 New Member

    Публикаций:
    0
    Регистрация:
    11 май 2009
    Сообщения:
    15
    Блин, надо было EXCEPTION_EXECUTE_HANDLER :)
     
  14. lammer_222

    lammer_222 New Member

    Публикаций:
    0
    Регистрация:
    11 май 2009
    Сообщения:
    15
    т.е. ответом на топик было:
    Код (Text):
    1. #pragma comment(linker, "/ENTRY:NewWinMain")
    2. #pragma comment(lib, "exsup.lib")
    3. void NewWinMain()
    4. {
    5.     __try
    6.     {
    7.         wsprintfA(0,"fuck");
    8.     }
    9.     __except(EXCEPTION_EXECUTE_HANDLE)
    10.     {
    11.         MessageBoxA(0,"Oooops","",0);
    12.     }
    13.    
    14. }
    Топик мона закрывать, все ОГРОМНОЕ спасибо! :)
     
  15. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    lammer_222
    скорей всего оно включает и стантартный форматер вьюер неотрезолвенного ексепшена. проверьте.
    впрочем, что вам мешает написать пару макросов с установщиками/снималками/обработчиками ексепшена через асм? или воспользоваться veh?
     
  16. dendi

    dendi New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2007
    Сообщения:
    233
    можно прилепить crt от шестой студии и компилить чтобы она было в импорте. тогда тоже файл будет маленьким и dll есть во всех виндах.