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을 블록 (그냥 추측) .
누군가 나를 도울 수 있습니까?