SIGINT and GetProcAdress(..) FAIL

Тема в разделе "LANGS.C", создана пользователем soMan, 28 фев 2012.

  1. soMan

    soMan New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2012
    Сообщения:
    1
    Приветствую всех! Натыкаюсь в программе (обычная однопоточная консолька, делающая несколько запросиков) на SIGINT. Программа использует libCURL (+ OpenSSL + zlib). Натыкаюсь, только если использую соединение к защищенным ресурсам (HTTPS). Обращаясь только к HTTP процесс завершается нормально без ошибок.
    Прогнал через профилирование в Dependency Walker и увидел две ошибки:
    Цитата
    127 ошибка говорит нам, что такой функции нету в дллке. MSDN и исходники OpenSSL подсказывают, что эта функция используется на WinCe, при этом макросы для WinCe при сборке OpenSSL я не использовал. Вторая ошибка похожая, только с функцией _OPENSSL_isservice. Ее я решил пересобрав OpenSSL с макросом _WIN32_WINNT=_WIN32_WINNT_WIN7. Как решить первую не знаю. Насколько понимаю, эта ошибка и является причиной SIGINT.

    А также:
    - Без отладки и запуска вне IDE это выглядит как стандартное окошко ошибки винды после отработки программы.
    - Все либы собирал самостоятельно из исходников.
    - Юзал в программе ключи линкера -libgcc, -libstdc++ - ничего не изменилось.
    - В таблице экспорта kernel32.dll отсутствует функция CloseToolhelp32Snapshot.

    Кусок кода из OpenSSL, где юзается этот самый GetProcAddress(...CloseToolhelp32Snapshot)
    Код (Text):
    1. #include <tlhelp32.h>
    2. #ifdef _WIN32_WCE
    3. # define DLLNAME "TOOLHELP.DLL"
    4. #else
    5. # ifdef MODULEENTRY32
    6. # undef MODULEENTRY32   /* unmask the ASCII version! */
    7. # endif
    8. # define DLLNAME "KERNEL32.DLL"
    9. #endif
    10.  
    11. typedef HANDLE (WINAPI *CREATETOOLHELP32SNAPSHOT)(DWORD, DWORD);
    12. typedef BOOL (WINAPI *CLOSETOOLHELP32SNAPSHOT)(HANDLE);
    13. typedef BOOL (WINAPI *MODULE32)(HANDLE, MODULEENTRY32 *);
    14.  
    15. static int win32_pathbyaddr(void *addr,char *path,int sz)
    16. {
    17.     HMODULE dll;
    18.     HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
    19.     MODULEENTRY32 me32;
    20.     CREATETOOLHELP32SNAPSHOT create_snap;
    21.     CLOSETOOLHELP32SNAPSHOT  close_snap;
    22.     MODULE32 module_first, module_next;
    23.     int len;
    24.  
    25.     if (addr == NULL)
    26.         {
    27.         union   { int(*f)(void*,char*,int); void *p; } t =
    28.             { win32_pathbyaddr };
    29.         addr = t.p;
    30.         }
    31.  
    32.     dll = LoadLibrary(TEXT(DLLNAME));
    33.     if (dll == NULL)
    34.         {
    35.         DSOerr(DSO_F_WIN32_PATHBYADDR,DSO_R_UNSUPPORTED);
    36.         return -1;
    37.         }
    38.  
    39.     create_snap = (CREATETOOLHELP32SNAPSHOT)
    40.         GetProcAddress(dll,"CreateToolhelp32Snapshot");
    41.     if (create_snap == NULL)
    42.         {
    43.         FreeLibrary(dll);
    44.         DSOerr(DSO_F_WIN32_PATHBYADDR,DSO_R_UNSUPPORTED);
    45.         return -1;
    46.         }
    47.     /* We take the rest for granted... */
    48. #ifdef _WIN32_WCE
    49.     close_snap = (CLOSETOOLHELP32SNAPSHOT)
    50.         GetProcAddress(dll,"CloseToolhelp32Snapshot");
    51. #else
    52.     close_snap = (CLOSETOOLHELP32SNAPSHOT)CloseHandle;
    53. #endif
    54.     module_first = (MODULE32)GetProcAddress(dll,"Module32First");
    55.     module_next  = (MODULE32)GetProcAddress(dll,"Module32Next");
    56.  
    57.     hModuleSnap = (*create_snap)(TH32CS_SNAPMODULE,0);
    58.     if( hModuleSnap == INVALID_HANDLE_VALUE )
    59.         {
    60.         FreeLibrary(dll);
    61.         DSOerr(DSO_F_WIN32_PATHBYADDR,DSO_R_UNSUPPORTED);
    62.         return -1;
    63.         }
    64.  
    65.     me32.dwSize = sizeof(me32);
    66.  
    67.     if(!(*module_first)(hModuleSnap,&me32))
    68.         {
    69.         (*close_snap)(hModuleSnap);
    70.         FreeLibrary(dll);
    71.         DSOerr(DSO_F_WIN32_PATHBYADDR,DSO_R_FAILURE);
    72.         return -1;
    73.         }
    74.  
    75.     do      {
    76.         if ((BYTE *)addr >= me32.modBaseAddr &&
    77.             (BYTE *)addr <  me32.modBaseAddr+me32.modBaseSize)
    78.             {
    79.             (*close_snap)(hModuleSnap);
    80.             FreeLibrary(dll);
    81. #ifdef _WIN32_WCE
    82. # if _WIN32_WCE >= 101
    83.             return WideCharToMultiByte(CP_ACP,0,me32.szExePath,-1,
    84.                             path,sz,NULL,NULL);
    85. # else
    86.             len = (int)wcslen(me32.szExePath);
    87.             if (sz <= 0) return len+1;
    88.             if (len >= sz) len=sz-1;
    89.             for(i=0;i<len;i++)
    90.                 path[i] = (char)me32.szExePath[i];
    91.             path[len++] = 0;
    92.             return len;
    93. # endif
    94. #else
    95.             len = (int)strlen(me32.szExePath);
    96.             if (sz <= 0) return len+1;
    97.             if (len >= sz) len=sz-1;
    98.             memcpy(path,me32.szExePath,len);
    99.             path[len++] = 0;
    100.             return len;
    101. #endif
    102.             }
    103.         } while((*module_next)(hModuleSnap, &me32));
    104.  
    105.     (*close_snap)(hModuleSnap);
    106.     FreeLibrary(dll);
    107.     return 0;
    108. }
    Вот Makefile, по которому собирал OpenSSL. Просьба, подскажите, куда копать или как решить данный вопрос.
    Допинфо:
    Компилятор: gcc 4.6.2 (MinGW)
    IDE: Eclipse CDT 3.7.2
    ОС: Win 7 Pro x86
    Либы: libCURL 7.24.0, OpenSSL 1.0.0g, zlib 1.2.6