Как вычленить CRT в проекте?

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 28 июн 2011.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Визуалстудия 2008 экспресс.Есть проект.Немогу сказать что большой.Но текста там много.И файлов то же.Надо найти в нем вызовы всех CRT ф-ций.МОжно для этого использовать встроенные или какие сторонние утилиты?Преследую цель полного избавления от MSVCR90.dll
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    /NODEFAULTLIB и линкер выведет список ненайденных символов (функций), в этом списке отбросить функции из всяких kernel32.dll и других подобных библиотек и остануться функции CRT... добрую половину которых можно заменить на соответствующие функции из msvcrt.dll, kernel32.dll, user32.dll, ntdll.dll... в студии вообще очень толстый CRT, одна из причин, по которой я ее не люблю... :derisive:
     
  3. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Проблема с memcpy липучим.Смотрю в импорт а он там единственный висит.Делаю поиск по файлам,но не в одном *.c,не в *.h, не в*.cpp.Его ненаходит =/ В чем прикол?
     
  4. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    _nic
    он самый липучий.Както нужно было без импорта обойтись - написал свой memcpy(), есессно ЦРТ даже не пахло в моем проже, но была ntdll.lib подключена, так студия "увидев" сигнатурку копирования памяти лепила мне импорт ntdll!memcpy - вот так вот, асм форева.)
    NODEFAULTLIB в линкера настройках и в Си\С++ еще там надо вырубить прооверки стека и т.п. = ЦРТ уходит тихо спать
     
  5. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    всякие функции типа CopyMemory в студии препроцессором подменяются на memcpy... если используешь какой-нить std::string, то наверняка рн за собой тянет... ну и можно до бесконечности продолжать...
     
  6. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    как, например, простая инициализация локальной переменной-структуры нулями потянет за собой memset.
    Поэтому единственно верный путь избавления от внешних зависимостей с msvcrX.dll - перевод их во внутренние, то бишь использование статического связывания.
     
  7. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Мне что все ф-ции динамически вызывать?(
    ЗЫ:с
    Код (Text):
    1. #pragma comment( linker, "/NODEFAULTLIB")
    отключаю проверку буфера ,и такое вот
    всеравно :dntknw:
     
  8. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    так откуда ему взяться то, подключите ntdll.lib
     
  9. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Непомагает
     
  10. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    где? выводится же какому объектному файлу необходим memcpy... там и ищи...
     
  11. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    забейте и юзайте
    Код (Text):
    1. VOID
    2. MemCpy(
    3.     IN      PVOID       Dest,
    4.     IN      PVOID       Src,
    5.     IN      ULONG       Size
    6.     )
    7. {
    8.     ULONG   i;
    9.  
    10.     for (i=0; i < Size; i++)
    11.         ((PBYTE)Dest)[i] = ((PBYTE)Src)[i];
    12.  
    13.     return;
    14. }
    или давайте сюда прож....у меня все норм работает без ЦРТ (забыл когда его последний раз юзал)
     
  12. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    1) http://msdn.microsoft.com/en-us/library/f99tchzc.aspx, может помочь, но мне не помогло.

    2) Из-за некоторых оптимизаций, компилятор принимает решение заменить ваш алгоритм на memcpy - это не управляется (судя по моим бессонным ночам), хотя может что-то и можно намудрить с опциями компилятора...

    Искать такие оптимизации довольно сложно, проще написать свою memcpy, и прочие требуемые функций.

    Т.е. прямо так и нужно писать реализацию на прототип:
    ~
    Код (Text):
    1. void * __cdecl memcpy (void * dst, const void * src,  size_t count)
    Функцию можно взять тут: "%VS%\VC\crt\src\memcpy.c"

    И если память не подводит еше нужен препроцессор #pragma function(memcpy)

    3) Можно вернуться к msvcrt.dll, http://kobyk.wordpress.com/2007/07/20/dynamically-linking-with-msvcrtdll-using-visual-c-2005/
     
  13. disciple27

    disciple27 New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2011
    Сообщения:
    1
    Попробуйте указать точку входа вручную, то есть использовать не _main или WinMain... но тогда придется отказаться от всяких вкусностей типа new и delete...
    И в свойствах компилятора указать 'Библиотека времени выполнения -> Многопоточная (/MT) или (/MTd)'

    Код (Text):
    1. #include "windows.h"
    2. #pragma comment (linker, "/ENTRY:EntryPoint")
    3.  
    4. // здесь был вызов функции _main
    5. void EntryPoint ()
    6. {
    7.      hInst = GetModuleHandle (NULL);
    8. }
     
  14. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Я этто в 1ю очередь сделал и это не имеет никакого отношения к memcpy
    ЗЫ:в ntdll реально есть реализация memcpy ???
     
  15. Xml

    Xml New Member

    Публикаций:
    0
    Регистрация:
    18 май 2011
    Сообщения:
    54
    отдельный lib собрать с _memcpy и т.п. нужными символами в экспорте
     
  16. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    >в ntdll реально есть реализация memcpy ???
    откройте в любом PE вивере, там есть не только memcpy..
    _nic
    обьясните что именно у вас не так - вы юзаете memcpy() а оно кричит что не понимает чего вы хотите, или же у вас просто прож и почему то оно кричит что не понимает что такое memcpy()???

    Xml
    большего бреда слышать не приходилось....
     
  17. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    /Oi- помогло.
    Но теперь по серьезней проблема.Проект юзает zlib.lib а там идут цртшные вызовы :dntknw: А я уже даже и не помню как мне удалось собрать этот zlib.lib(
     
  18. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    все crt вызовы, что там нужны, наверняка есть в msvcrt.dll...
     
  19. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Создал деф файл с помощью implib.Пытаюсь при помощи стандартного lib.exe создать *.lib файл.И тут обломец
     
  20. Xml

    Xml New Member

    Публикаций:
    0
    Регистрация:
    18 май 2011
    Сообщения:
    54
    ASMatic
    угу, только это работает в любом виде в отличие от недосоветов выше
    решать в любом случае тс