0

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 が発生しています。
誰かが私を助けることができますか?

4

1 に答える 1

0

http://curl.haxx.se/libcurl/c/curl_global_init.htmlcurl_global_initに記載されているように、最初にロードして呼び出します。

于 2015-01-09T09:29:36.977 に答える