問題タブ [fpic]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
makefile - -fPICオプションを使用して再コンパイルしますが、オプションはすでにmakefileにあります
makeを実行すると、このエラーが発生します。
オプションで再コンパイルする必要があると書かれてい-fPIC
ます。とに-fPIC
オプションを追加してそれを行いましたが、それでも同じエラーが発生します。これを解決する方法はありますか?この問題は64ビットマシンの使用に関連していることを確認しましたが、実際に使用しています。CFLAGS
CXXFLAGS
c++ - 共有ライブラリを構築するときの -fPIC の意味は何ですか?
' ' オプションがアドレスの解決と個々のモジュール間の独立性に関係していることは知ってい-fPIC
ますが、それが実際に何を意味するのかはわかりません。説明できますか?
gcc - オブジェクトが実行可能ファイルで使用される場合、gcc -fPICフラグを使用してオブジェクトをコンパイルすることの意味は何ですか?
作業中のプロジェクトのmakefileをまとめています。プロジェクトに実行可能ファイルと共有ライブラリがあります。どちらも、オブジェクトファイルに個別にコンパイルされる同じソースファイルのいくつかを使用します。共有ライブラリでこれらのオブジェクトを使用できるようにするには、gccで-fPIC(位置独立コード)フラグを使用する必要があります。実行可能ファイルで使用される-fPICを使用してオブジェクトをコンパイルすることの意味はありますか?
c - 静的ライブラリに対して共有ライブラリをリンクする: 静的ライブラリは、アプリケーションがリンクする場合とは異なる方法でコンパイルする必要がありますか?
少なくとも Linux と Solaris では、静的ライブラリは実際にはコンパイル済みの .o を 1 つの大きなファイルにまとめたものにすぎません。スタティック ライブラリをコンパイルする場合、通常 -fpic フラグは省略されるため、生成されるコードは位置に依存します。
ここで、静的ライブラリが B であるとします。これをビルドして、結果の .a ファイルを作成しました。これは、位置に依存するすべての .o ファイルの単なるグロブです。今、ビルドしたい共有ライブラリ A があり、B を静的にリンクさせたいと考えています。A をビルドするときは、当然、-fpic フラグを使用して、生成されたコードの位置を独立させます。しかし、B に対してリンクすると、位置依存のオブジェクト ファイルと位置非依存のオブジェクト ファイルが混在していませんか?
-mimpure-text も指定しないと、テキストの再配置エラーが多く発生します。おそらくこれが原因だと思います。ライブラリをコンパイルするとき、共有バージョン、静的バージョン、共有ライブラリで使用できる静的バージョンの3回コンパイルする必要があるようです。私は正しいですか?-mimpure-text を使い続けることもできますが、g++ のマニュアル ページには、そうするとオブジェクトが実際に共有されないことが示されています (すべてが共有されていないのか、それとも静的にリンクされた部分だけなのかは不明ですが、誰か知っていますか?) .
gcc - 定数データの %pc 相対アドレスを生成しています
gcc%pc
に定数の相対アドレスを生成させる方法はありますか? 文字列がテキスト セグメントに表示される場合でも、arm-elf-gcc はデータへの定数ポインターを生成し、%pc
相対アドレスを介してポインターのアドレスをロードし、逆参照します。さまざまな理由から、中間のステップをスキップする必要があります。例として、この単純な関数:
を生成します (でコンパイルした場合arm-elf-gcc-4.3.2 -nostdlib -c
-O3 -W -Wall logfile.c
):
私はそれがもっと次のようなものを生成することを期待していたでしょう:
問題のコードは、ロード時にメモリ内で再配置されるため、部分的に位置に依存しない必要がありますが、コンパイルされていないコードと統合される-fPIC
ため、グローバル オフセット テーブルはありません。
私の現在の回避策は、非インライン関数(相対アドレスを介して行われます)を呼び出して、コードの動作%pc
と同様の手法でコンパイルされた場所からのオフセットを見つけることです。-fPIC
ただし、この手法ではすべてのデータ参照を手動で修正する必要があるためfilename()
、上記の例の関数は次のようになります。
gcc - .a または .so ライブラリが位置に依存しないコードとしてコンパイルされていることを確認する方法はありますか?
numpy ライブラリを lapack に対してコンパイルすると、-fPIC を使用して lapack をコンパイルする必要があることを示すリンク エラーが発生します。私はまさにそれをしたと思いました。生成された lapack ライブラリが位置に依存しないことを確認する方法はありますか?
gcc - `-fpic`と`-fPIC`gccパラメーターの違いは何ですか?
すでにマンページを読みましたが、とgcc
の違いがわかりません。誰かがそれを非常に単純で明確な方法で説明できますか?-fpic
-fPIC
関連する質問:
position - cortex-m3 で位置に依存しないコードを読み込もうとしています
内部フラッシュから直接 2 つのアプリケーションのうちの 1 つを実行することを決定するブートローダーを持つ組み込みアプリケーションがあります。これらのアプリの位置を独立させて、両方を同じベースアドレスでコンパイルできるようにしようとしています。オペレーティング システムがないため、動的リンカーは使用できません。これまでのところ、-fpie オプション (gcc を使用) を使用してビルドを試みましたが、あまり成功していません。関数呼び出しは正しいように見えますが、グローバル データには正しいアドレスがありません。ローカルで定義されたグローバル データのアドレスは、アプリが元のベース アドレスからオフセットされた分だけオフセットされているようです。他のファイルで宣言されているグローバル データのアドレスが完全に間違っています (-fpic でビルドすると、ローカルで宣言されたグローバル データと他のファイルのグローバル データの両方が完全に間違っています)。