1

うっかり、C++ の hello world プログラムで --shared フラグを付けてリンクして、exe ファイルを取得してしまいました。しかし、実行すると出力がsegfaultになります。誰かがその背後にある理由を教えてもらえますか?

再現方法:

eclipse c++ の標準 c++ hello world 問題。設定 - >共有ライブラリ設定の共有フラグボックスを確認してください。

ビルド出力:

make all ビルドファイル: ../app.cpp 呼び出し: GCC C++ Compiler g++ -O0 -g3 -Wall -c -fmessage-length=0 -fPIC -MMD -MP -MF"app.d" -MT"app.d " -o "app.o" "../app.cpp" ビルド完了: ../app.cpp

ビルド ターゲット: app 呼び出し: GCC C++ リンカ g++ -shared -o "app" ./app.o
完成したビルド ターゲット: app

実行出力: セグメンテーション違反

ありがとう

4

1 に答える 1

7

g++ マニュアルより: --shared 他のオブジェクトとリンクして実行可能ファイルを形成できる共有オブジェクトを生成します。すべてのシステムがこのオプションをサポートしているわけではありません。予測可能な結果を​​得るには、このオプションを指定するときに、コードの生成に使用されたのと同じ一連のオプション (-fpic、-fPIC、またはモデル サブオプション) も指定する必要があります。[1]

--shared オプションを指定すると、実行可能ファイルではなく共有オブジェクトが必要になります。

あなたの場合、実行可能ファイルではなく共有ライブラリを作成します。これが、起動時にセグメンテーション違反を起こす理由です。

于 2013-07-27T18:48:56.770 に答える