Проблема компиляции в VS 2005

Тема в разделе "LANGS.C", создана пользователем Asterix, 20 окт 2006.

  1. minlexx

    minlexx New Member

    Публикаций:
    0
    Регистрация:
    15 мар 2009
    Сообщения:
    4
    я знаю, я некропостер)) искал в гугле схожую проблему, неизвестно откуда берущийся memset при отсутствии (по идее) CRT

    идея подсунуть линкеру свою memset фейлится с ошибкой наподобие "невозможно переопределить intrinsic функцию"
    :)
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    s0larian
    не прокатит ;)

    minlexx
    вобще-то задача была заставить компилер заинлайнить функцию, в таком случае CRT не
    привязалась бы к проекту, такое спокойно проходит в MS VC++ 6.0, но не в MS VS .NET
    2005 и это бага

    частично задача была решена подсовыванием свое функции memset, т.е. в бинарник
    попала моя функция, а не реализация из CRT
     
  3. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    s0larian
    да с /NODEFAULTLIB, и функция была подсунута, но не в объектнике а в исходнике :)
     
  4. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Asterix, так это ж другой случай совсем. Если ты паришься с тем что компилер втыкает extern _memset, то это может решится на стадии линкера.
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    s0larian
    так не парюсь, уже давно понял что он не сделает так как можно было с 6-й по 2003 студию
     
  6. mael

    mael New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2009
    Сообщения:
    2
    Сегодня возился с этой же проблемой - как сделать intrinsic memset в VS2008.
    Решение - функции __stosb и __stosd

    было: memset (buf, 0, 1022);
    Код (Text):
    1.     push    1022                    ; 000003feH
    2.     lea eax, DWORD PTR _buf$[esp+1036]
    3.     push    0
    4.     push    eax
    5.     call    _memset
    стало: __stosb (buf, 0, 1022);
    Код (Text):
    1.     xor al, al
    2.     lea edi, DWORD PTR _buf$[esp+1044]
    3.     mov ecx, 1022               ; 000003feH
    4.     rep stosb
     
  7. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    неясно зачем парить мозг
    просит _memset/_memcpy_chkstk/_allmul/... - дайте ему это
    соберите lib файл с тем что вас просят и добавьте ее к проекту

    сколько уже раз можно поднимать эту тупую тему )?
     
  8. mael

    mael New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2009
    Сообщения:
    2
    можно, но intrinsic меньше и (возможно) быстрее => __stosd будет более эффективно, чем самописная функция memset

    PS. А если в CRT посмотреть функцию memset - это тихий ужас, мешанина условных переходов. Чем они думали - непонятно.
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    в топике было предложено нормальное решение, не работает разве?

    создаем файл memset.cpp
    Код (Text):
    1. #pragma function(memset)
    2.  
    3.  
    4.  
    5. extern "C"
    6. void * __cdecl memset (void *dst,
    7.                        int val,
    8.                        size_t count)
    9. {
    10.     void *start = dst;
    11.  
    12.     while (count--)
    13.     {
    14.         *(char *)dst = (char)val;
    15.         dst = (char *)dst + 1;
    16.     }
    17.     return (start);
    18. }
    подключаем к проекту
    Код (Text):
    1. #if _MSC_VER == 1400
    2. #include "memset.cpp"
    3. #endif  /* _MSC_VER == 1400 */
     
  10. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    только _MSC_VER для 2008 студии другая, поэтому вместо == написать >= будет уместно
     
  11. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    Код (Text):
    1. #include "crt.h"
    2.  
    3. __declspec(naked)
    4. void
    5. __cdecl
    6. _chkstk()
    7. {
    8.     __asm
    9.     {
    10.     //
    11.     // ecx = original esp
    12.     //
    13.         push        ecx  
    14.         lea         ecx,[esp+4]
    15.     //
    16.     // ecx = stack frame size
    17.     //
    18.         sub         ecx,eax
    19.     //
    20.     // eax = align_down(esp, PAGE_SIZE)
    21.     //
    22.         mov         eax,esp
    23.         and         eax,0FFFFF000h
    24.     chk_esp_pos:
    25.         cmp         ecx,eax
    26.         jb          one_more_page
    27.         mov         eax,ecx
    28.         pop         ecx  
    29.         xchg        eax,esp
    30.         mov         eax,dword ptr [eax]
    31.         mov         dword ptr [esp],eax
    32.         ret
    33.     one_more_page:
    34.     //
    35.     // eax = eax - PAGE_SIZE
    36.     //
    37.         sub         eax,1000h
    38.     //
    39.     // touch page
    40.     //
    41.         test        dword ptr [eax],eax
    42.     //
    43.     // step to the next one
    44.     //
    45.         jmp         chk_esp_pos
    46.     }
    47. }
    48.  
    49. #pragma intrinsic(__emulu)
    50. __int64
    51. __cdecl
    52. _allmul(
    53.     __int64 a,
    54.     __int64 b
    55.     )
    56. {
    57.     return  __emulu(LODWORD(a), LODWORD(b)) +
    58.             MAKEQWORD(
    59.                 0,
    60.                 LODWORD(HIDWORD(a)*LODWORD(b) + LODWORD(a)*HIDWORD(b))
    61.                 );
    62. }
    63.  
    64. void *
    65. __cdecl
    66. memcpy(
    67.    void*        dest,
    68.    const void*  src,
    69.    unsigned int count
    70. )
    71. {
    72.     int i   = 0;
    73.  
    74.     for(i = 0; i < count; i++)
    75.     {
    76.         ((unsigned char* )dest)[i] =
    77.             ((unsigned char* )src)[i];
    78.     }
    79.  
    80.     return dest;
    81. }
    82.  
    83. void *
    84. __cdecl
    85. memset(
    86.    void*        dest,
    87.    int          c,
    88.    unsigned int count
    89. )
    90. {
    91.     int i   = 0;
    92.  
    93.     for(i = 0; i < count; i++)
    94.     {
    95.         ((unsigned char* )dest)[i] =
    96.             (unsigned char)c;
    97.     }
    98.  
    99.     return dest;
    100. }
    в lib файл и подключить к проекту
     
  12. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Помнится, нужно было мне как-то раз обойтись без RTL, и мешалась memset. При этом была включена link-time code generation, и на реализацию memset прямо в исходнике компилятор дико ругался.
    Метод со __stosd интересный, но, к сожалению, подходит только для замены явных вызовов memset, а компилятор студии имеет привычку вставлять memset и самостоятельно, в конструкциях типа
    Код (Text):
    1. some_struct t = {0};
    и
    Код (Text):
    1. for (int i=0;i<n;i++) p[i]=1;
    - для таких вызовов всё же придётся реализовывать memset.
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    линкуем ntdll.lib и юзаем memset/memcpy из ntdlll.dll
     
  14. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    n0name
    а в 9х как оно будет работать?
     
  15. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    9х неподдерживаемая ось из эпохи динозавров. пора бы уже снести давно. облегченная XP на любой машине идет
    а по теме - нужно crt.lib свою собрать и жить дальше
     
  16. Asterix

    Asterix New Member

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