c++0xでcgi

下記urlのソースをgcc 4.6.1でコンパイルしたバイナリをレンタルサーバ(tok2)で動かそうとしています。このサーバはバイナリcgiをサポートしています。
http://d.hatena.ne.jp/neuromancer_sho/20111024/1319447432

g++のオプションで -static を指定しているので、サーバ側に手元のマシン上のライブラリが無くても動作するだろう、と予測したのですが、Internal Server Errorになってしまいます。エラーログなどはサーバ仕様上見れません。手元のlinuxマシンではapache上でcgiとして動作しています。

特殊なライブラリを使用しない、c++0xの新命令も使用しないcgi
cout<<"Content-Type: text/html\n\n"<<endl; など
であれば、正常に動きます。

サーバ側にライブラリ(soファイル??)が無いとダメなのでしょうか?

レンタルサーバのスペック:
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46)
Linux 17.pro.tok2.com 2.6.18-164.11.1.el5xen #1 SMP Wed Jan 20 08:53:10 EST 2010 i686 i686 i386 GNU/Linux

手元のマシンのスペック:
gcc (GCC) 4.6.1 20110819 (prerelease)
Linux arch 2.6.33.7-co-0.7.9 #1 PREEMPT Sat Apr 9 20:30:51 UTC 2011 i686 Intel(R) Core(TM) i5 CPU 750 @ 2.67GHz GenuineIntel GNU/Linux

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/10/28 12:52:42
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:a-kuma3 No.1

回答回数4971ベストアンサー獲得回数2153

# ただの思いつきです


        while(dent = readdir(dir))
            ret.push_back(dent->d_name);

のくだりで、dent->d_name って複製しなくて大丈夫でしょうか?

下のようにしたくなっちゃいますが...

        while(dent = readdir(dir)) {
            string s(dent->d_name);
            ret.push_back(s);
        }
id:tdoi

暗黙の型変換で実質は同じ扱いになる気がするのでこれは問題ない気がします。

2011/10/25 12:57:51
id:a-kuma3
    vector<string> ret;

目がザルでした...

2011/10/25 13:08:20
  • id:tdoi
    手元の環境でlddとかしても、依存ライブラリはないことは確認してると思っていいですか?
  • id:neuromancer_sho
    tdoiさん
    その手法を理解してませんでした。
    ldd したところ、
    linux-gate.so.1 => (0xffffe000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb75ef000)
    libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0xb75d2000)
    libc.so.6 => /lib/libc.so.6 (0xb7469000)
    libm.so.6 => /lib/libm.so.6 (0xb743f000)
    /lib/ld-linux.so.2 (0xb76e6000)
    となり、この中のlinux-gate.so.1 がサーバには存在してませんでした。
    ありがとうございます。
    soファイルを含めてスタティックリンクする事は出来ないのでしょうか?
  • id:tdoi
    shared libraryをスタティックリンクすることはできないので、同内容のスタティックライブラリ(拡張子.a)を用意する必要があるでしょうね。とはいえ、linux-gate.so.1もダイナミックリンクで別なライブラリをリンクしている可能性もあり結構大変かもですね。


    以下のリンクとか参考になるかもです。
    http://www.trilithium.com/johan/2005/06/static-libstdc/

    でも、libstdc++.so.6とかはスタティックリンクされそうなもんなんですけどね。
    -static-libstdc++ とかつけると変わりますかね。

    http://blog.kmckk.com/archives/2149044.html
  • id:neuromancer_sho
    すみません、先程のlddの結果は-staticを付けなかった物でした。-staticを付けた場合には、
    「動的実行ファイルではありません」と返って来ました。、となると動的ライブラリの問題では無いということになりますかね。。

    -static に -static-libstdc++ を付け足したバイナリは同じものでした。

    fileコマンドでは
    ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.27, BuildID[sha1]=0xf3cef00f82da2fdbec363f80a51e86b2e9889b93, not stripped
    と表示されました。この情報を元にサーバの対応状況を調べようと思います。

    色々参考になります。ありがとうございます。
  • id:tdoi
    ちなみに、cgiccの問題なのか、c++0xの問題なのかは切り分け出来ました?
    autoをやめて見るとか、cgiccを使わずにヘッダをはくとか、それぞれやってみると、調べる対象が切り分けられていいかもです。
  • id:neuromancer_sho
    サーバ上にperlスクリプトを作り、system("./cpp.cgi")関数で呼んで戻り値を見て見ました。
    cgicc不使用(リンクも無し)の場合も、c++0x不使用(-stdオプションも無し)の場合も、
    11が返って来ます。
    そして、両方不使用でstaticリンクしたものも11、dynamicの場合、正常な結果が返って来ました。

    どうやら問題はstaticリンクにある様な気がしてきました。

    サーバ上でstaticとdynamic両方でsystem("file cpp.cgi") したところ、
    ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), for GNU/Linux 2.6.27, dynamically linked
    ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.27, dynamically linked
    となり、"version 1 "の後ろの(SYSV)というのが成功パターンの様な気がしてきました。
  • id:neuromancer_sho
    あれ、でも11ってSIGSEGVですね。
    ひょっとして、ファイルが大きすぎて実行させてもらえないんでしょうか・・・
    1.2MBもあるし・・
  • id:neuromancer_sho
    (SYSV)だと成功というのは勘違いでした。
    C++をやめて、C言語の最小構成で試したところ、dynamicでもstaticでも(SYSV)表示になりましたが、staticのreturnコードは11のままです。
    static実行禁止 又は ファイルが大きすぎ(612kBまで減りましたが)のどちらかみたいな感じです。

    printf("Content-Type: text/html\n\n");
    printf("Hello, Cgi\n");
  • id:neuromancer_sho
    動きました。
    ソースはこのままで、g++のオプションに-staticをつけるのはやめて、
    g++ cppcgi.cpp -std=c++0x /usr/lib/libcgicc.a /usr/lib/libstdc++.a -o cppcgi.cgi

    fileコマンドの結果はdynamically linked です。
    statically linkedだとダメ。という結果ですが、理由は分かりません。
  • id:tdoi
    質問文には、

    特殊なライブラリを使用しない、c++0xの新命令も使用しないcgi
    cout<<"Content-Type: text/html\n\n"<<endl; など
    であれば、正常に動きます。

    とあったのですが、こんなコードでもスタティックリンクするとダメだったということですよね?
  • id:tdoi
    お~!動いたようでなによりです。
  • id:a-kuma3
    >あれ、でも11ってSIGSEGVですね。
    system 関数の戻り値って、子プロセスが出したシグナルを返すわけじゃないですよね。
    ERRNO が返ってきてるのじゃないか、と思うのですけれど。

    ERRNO = 11 は、EAGAIN で、リソースが利用できないときに出るやつです。
  • id:a-kuma3
    # あー、流れに乗れてない orz
  • id:neuromancer_sho
    >とあったのですが、こんなコードでもスタティックリンクするとダメだったということですよね?

    そうなんです。よくわかりません。

    >system 関数の戻り値って
    シェルの戻り値と子プロセスの戻り値が8bitづつくっついているイメージだと勝手に想像してました。リソースが利用できないですか、勉強してみます。

    お二人とも、ご協力いただいてありがとうございました。

この質問への反応(ブックマークコメント)

トラックバック

  • c++11(c++0x)でcgi c++11でテキスト処理が大分楽に出来る様になってきたので、そろそろcgiもc++で良いのではないか? 使うライブラリ候補 fastcgi++ 用途が合ってるのか不明 cgicc http://www.gnu.org/s/cgic
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません