libcurl を動的にリンクしようとしていますが、easy_performing のときに Segfault が発生します。
グローバルスコープ宣言は次のとおりです。
#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 のときに segfault が発生しました:
if ( (res = (*curl_easy_perform)(curl)) != CURLE_OK ){
return -1;
}
エラーは簡単に実行できると確信していますが、先に進んでcore_dumpを生成することにしました。このコアを gdb すると、実際には easy_init でエラーが発生しました。
プログラムはシグナル 11、セグメンテーション違反で終了しました。curlapp からの curl_easy_init () の #0 0x00007f3d2f9cd3f8
ここで何が間違っているのか、誰にも考えがありますか?
前もって感謝します!
[編集]
curl_easy_perform ブロックを削除すると、プログラムは正常に実行されます。curl_easy_perform() が原因で失敗したのか、それとも単にこの関数で問題が発生したのかはわかりません。つまり、「init」と「setopts」が easy_perform にのみ適用されることを意味します。(あくまで推測です)
[編集2]
変更された dlsym ブロック:
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() で Segfault が発生しています。
誰かが私を助けることができますか?