2014-11-13 4 views
0

libcurl을 동적으로 연결하려고하는데 easy_performing을 할 때 Segfault가 발생합니다. 동적으로 LibCURL을 링크하는 중 오류가 발생했습니다.

#define LIBCURL_PATH_64  "/usr/lib64/libcurl.so" 
void *hLibCurl = NULL; 
CURL *curl; 
CURL* (*curl_easy_init)(void); 
CURLcode (*curl_easy_setopt)(CURL *, CURLoption, ...); 
CURLcode (*curl_easy_perform)(CURL *); 
const char* (*curl_easy_strerror)(CURLcode); 
struct curl_slist* (*curl_slist_append)(struct curl_slist *, const char *); 

가 그럼 난 동적으로 연결 :

hLibCurl = dlopen(LIBCURL_PATH_64, RTLD_NOW); 
    *(void**) (&curl_easy_init) = dlsym(hLibCurl, "curl_easy_init"); 
    *(void**) (&curl_slist_append) = dlsym(hLibCurl, "curl_slist_append"); 
    *(void**) (&curl_easy_setopt) = dlsym(hLibCurl, "curl_easy_setopt"); 
    *(void**) (&curl_easy_strerror) = dlsym(hLibCurl, "curl_easy_strerror"); 
    *(void**) (&curl_easy_perform) = dlsym(hLibCurl, "curl_easy_perform"); 
    if ((curl = (*curl_easy_init)()) == NULL){ 
    LogMsg("CurlInit easy_init failed"); 
    return -1; 
    } 

그것은하지 않습니다 종료 또는이 시점에서 실패
다음은 전역 선언이다.
여기 쇼가 시작됩니다. 이 같은 curlopts를 설정할 때, 나는 오류 없어 :

if ((*curl_easy_setopt)(curl, CURLOPT_POST, 1) != CURLE_OK) { 
    LogMsg("curl_easy_setopt(curl, CURLOPT_POST, 1) failed"); 
    return -1; 
    } 
    if ((*curl_easy_setopt)(curl, CURLOPT_URL, "https://ws.service.com.br/services-nac/services/SomeService?wsdl") != CURLE_OK) { 
    LogMsg("curl_easy_setopt(curl, CURLOPT_URL) failed"); 
    return -1; 
    } 
    if ((*curl_easy_setopt)(curl, CURLOPT_PORT, 443) != CURLE_OK) { 
    LogMsg("curl_easy_setopt(curl, CURLOPT_PORT, 443) failed"); 
    return -1; 
    } 

을하지만, easy_performing 때 나는 세그먼트 폴트 가지고 :

if ((res = (*curl_easy_perform)(curl)) != CURLE_OK){ 
     return -1; 
    } 

내가 쉽게 수행에 오류가 확실 해요,하지만 난 가기로 결정 core_dump를 생성하십시오.

Program terminated with signal 11, Segmentation fault. #0 0x00007f3d2f9cd3f8 in curl_easy_init() from curlapp

사람이 여기 잘못 될 수있는 아이디어를 가지고 :이 코어를 gdb를 할 때 , 나는 실제로 easy_init에 오류가있어?

미리 감사드립니다.


[편집]

은 내가 curl_easy_perform 블록을 삭제 한 프로그램이 정상적으로 실행됩니다. curl_easy_perform() 때문에 실패했거나이 함수에서 발생했기 때문에 발생합니다. 즉, 'init'을 의미 할 수 있으며 'setopts'는 easy_perform에만 적용됩니다.

curl_easy_init = 
    (CURL* (*)(void)) 
     dlsym(hLibCurl, "curl_easy_init"); 
    curl_slist_append = 
    (struct curl_slist*(*)(struct curl_slist *, const char *)) 
     dlsym(hLibCurl, "curl_slist_append"); 
    curl_easy_setopt = 
    (CURLcode (*)(CURL *, CURLoption, ...)) 
     dlsym(hLibCurl, "curl_easy_setopt"); 
    curl_easy_perform = 
    (CURLcode (*)(CURL *)) 
     dlsym(hLibCurl, "curl_easy_perform"); 

그리고 기능에

호출 :

if (curl_easy_setopt(curl, CURLOPT_POST, 1) != CURLE_OK) { 
    if (DEBUG_DETAILS) vTrace("curl_easy_setopt(curl, CURLOPT_POST, 1) failed"); 
    return -1; 
    } 

하지만 여전히 curl_easy_init에서 세그먼트 폴트를 받고()

[EDIT2]

변경된 dlsym을 블록 (그냥 추측) .
누군가 나를 도울 수 있습니까?

답변

0

과 같이 먼저 curl_global_init을로드하여 호출하십시오.
관련 문제