2016-06-15 6 views
2

私は、g ++で-fPICオプションを使用してC++静的ライブラリをコンパイルしています。最終的にはこのライブラリを他の静的ライブラリとリンクして動的ライブラリを形成するため、-fPICオプションを使用する必要があります。静的ライブラリをコンパイルするために-fPICを指定すると、実行時にセグメンテーション違反が発生するのはなぜですか?

静的ライブラリをローカルでテストすると、-fPICオプションを指定しないと完全に正常に動作します。しかし、ライブラリを-fPICでコンパイルするとすぐに、関数の1つを呼び出すときに実行時にセグメント化エラーが発生します。

静的ライブラリをコンパイルするために-fPICを使用すると、実行時にセグメンテーション違反が発生する理由は何ですか?

+1

これは非常に一般的なことですが、あなたのコードに未定義の動作が含まれていると何かが起きる可能性があり、コンパイラフラグを変更すると、そのUBを新しい方法で悪用する可能性があります。 UBが関与している場合。ちょうど長時間の推測... –

+0

それは私が思っていたラインに沿っている。私は-fPICでかなりの読書をしましたが、他の誰かがそのコードにランタイムエラーを報告するのを見つけることができませんでした(ほとんどの場合、問題の解決策である-fPICを含んでいました) –

+0

再現性があり、コンパイル可能なテストケースを提供しています。それは問題の診断に役立ちます。 http://sscce.org –

答えて

2

ダイナミックライブラリは実行時にロードされるはずなので、位置依存コードを持つことはできません。

静的ライブラリは、オブジェクトファイルの単なるアーカイブです。

ダイナミックライブラリとリンクするとき、リンカはライブラリの名前を実行可能ファイルに追加するので、ローダはプログラムのロード時にロードできます。リンカが静的ライブラリとリンクすると、基本的にオブジェクトファイルが抽出され、他のオブジェクトファイルと同様にリンクされます。

他のすべてのオブジェクトファイルが位置に依存しない(プログラムコードに-fPICを使用する)実行ファイルを作成しない限り、位置に依存しないコードを使用する静的ライブラリにリンクすることはできません。単純に設定しないでください。

+0

それでは、静的ライブラリ(-fPICオプション付き)をコンパイルするとしましょう。今、私は静的ライブラリをTest.cpp(mainメソッドを持っています)でコンパイルしたいと思います。生成された実行可能ファイルを実行すると、main関数が呼び出された関数のうちの1つのみがセグメンテーション違反を引き起こし、残りのコードは正常に動作します。しかし、静的ライブラリが-fPICなしでコンパイルされると、生成された実行可能ファイル内のすべてのコードがgで動作します。では、-fPICを組み込むと、コードの一部だけが失敗するのはなぜですか? –

+0

@ConnorFloodこれ以上の情報なしでは本当に言うことは不可能で、すべての機能が何をしているかによって異なります。ライブラリ内の他の関数を呼び出せる関数はありますか?クラッシュする機能はそれを行いますか? –

関連する問題