

高岡智則
年齢:33歳 性別:男性 職業:Webディレクター(兼ライティング・SNS運用担当) 居住地:東京都杉並区・永福町の1LDKマンション 出身地:神奈川県川崎市 身長:176cm 体系:細身〜普通(最近ちょっとお腹が気になる) 血液型:A型 誕生日:1992年11月20日 最終学歴:明治大学・情報コミュニケーション学部卒 通勤:京王井の頭線で渋谷まで(通勤20分) 家族構成:一人暮らし、実家には両親と2歳下の妹 恋愛事情:独身。彼女は2年いない(本人は「忙しいだけ」と言い張る)
fpicとは何か
fpicとは position independent code の略称です。ここでいう position independent とは「コードが実行時にどのアドレスにロードされても正しく動く」ことを指します。これは主に共有ライブラリや PIE 形式の実行ファイルを作る際に必要な性質です。Linux や UNIX 系の環境では -fPIC というコンパイルオプションを使ってこの性質を得ます。
なぜ位置非依存コードが必要か
現代のOSは ASLR と呼ばれるランダムなアドレス配置を用いてセキュリティを高めています。共有ライブラリは実行時に任意のアドレスにロードされるため、コード内の絶対アドレス参照を避けて相対参照や間接参照で動く設計が必要です。このためには GOT グローバルオフセットテーブルや PLT プラットフォーム固有の仕組みが使われます。結果として -fPIC のようなオプションを用いて位置非依存コードを生成します。
実際の使い方とコマンド例
共有ライブラリを作る場合の基本的な流れは次の通りです。まずソースをコンパイルしてオブジェクトファイルを作成し、それを -fPIC で位置非依存コードとしてリンクします。代表的なコマンド例は以下です。
gcc -fPIC -shared -o libmylib.so mylib.o
この libmylib.so が他のプログラムから自由な場所に読み込まれても正しく動作します。
一方で実行ファイルを PIE 形式にしたい場合は -fPIE と -pie を組み合わせて使います。
gcc -fPIE -pie -o myprogram myprogram.c
以上の違いを簡単にまとめると -fPIC は共有ライブラリ用の位置非依存コードを作るためのオプション、-fPIE は実行ファイル用の位置非依存コードを作るためのオプション、-pie はリンク時に PIE を有効化するためのオプションです
よくある誤解と落とし穴
誤解の一つとして「-fPIC を使えばすべて安全」と思われがちですが、コードの設計自体も位置非依存に適した作り方を意識する必要があります。絶対アドレス参照を避ける、グローバルデータの取り扱いを GOT で補間する、関数の呼び出し規約に従う といった点が重要です。
また、Static ライブラリを -fPIC 付きで作成しても、静的リンクの用途には適さないことがあります。状況に応じて -fPIC の適用範囲を分けることが必要です。
比較表と実務のポイント
| 項目 | 説明 | 主な用途 |
|---|---|---|
| -fPIC | 位置非依存コードを生成 | 共有ライブラリの生成に主に使われる |
| -fPIE | 実行ファイル用の位置非依存コードを生成 | 実行ファイルを PIE 化する際に使用 |
| -pie | リンク時に PIE を有効化 | 実行ファイルを PIE 化する際のオプション |
重要な点としては、環境に応じて適切なオプションを使い分けることです。現代の多くの Linux ディストリビューションでは -fPIC が標準的に推奨され、実行ファイルの PIE 化はセキュリティ面でのメリットが大きいです。
まとめ
fpic は位置非依存コードを生み出すための基本的な考え方とツールです。共有ライブラリを作る際には -fPIC を使い、実行ファイルを PIE 化したい場合は -fPIE と -pie を組み合わせます。適切に使えばロード時のアドレス依存性を抑え ASLR への対応や動的リンクの安定性を向上させることができます。
fpicの関連サジェスト解説
- fpic とは コンパイル
- この記事では fpic とは コンパイル について、初心者にも分かるように丁寧に説明します。C や C++ でプログラムを作るとき、将来別のプログラムと一緒に使えるようにするには、コードをどこからでも読み込めるようにする必要があります。これを実現するのが位置独立コード(Position Independent Code, PIC)です。fpic や fPIC はこの PIC を作るときのコンパイルオプションで、生成される機械語が実行時にアドレスを固定せず、どの場所に読み込まれても動くようになります。これを使う大きな理由は、後で作る共有ライブラリが他のプログラムと組み合わせやすくなることです。ふたつの用語について混同されがちですが、-fpic は古い規格に近く、アドレス空間の一部だけを安全に扱えるようにする場合があります。-fPIC はより幅広いアドレス空間に対応し、現代の多くの環境で推奨されることが多いです。実際には両者は多くの場面で同じように機能しますが、共有ライブラリを作る場合は -fPIC の使用を推奨します。もしもサイズを気にする小さなプログラムなら -fpic で十分なこともありますが、将来の拡張性を考えると -fPIC を選ぶのが無難です。使い方の例として、a.c というファイルを共有ライブラリにしたいときは次の手順を使います。まずコンパイルだけでオブジェクトファイルを作成します。 gcc -c -fPIC a.c -o a.o 次に共有ライブラリとしてリンクします。 gcc -shared -o liba.so a.o これで liba.so というファイルができ、他のプログラムから動的に読み込んで使えるようになります。反対に静的リンクの実行ファイルを作る場合は -fPIC を使う必要はありません。ポイントは、共有ライブラリを作るときには必ず -fPIC または -fpic を使い、実行環境によっては -fPIC の方が安全ということです。難しく感じるかもしれませんが、基本は「アドレスを決め打ちしないコードを作る」ことの理解と、必要な時に -fPIC を付けてコンパイルするだけです。初めての人でも慣れれば、どの場面で使えばいいのかが分かってきます。
fpicの同意語
- FPIC
- Free, Prior and Informed Consentの略。開発・プロジェクトが現地の人々に影響を与える場合、自由意志での同意・事前の承認・十分な情報提供を受けるべき原則を指します。
- 自由意思同意
- 個人または集団が、強制や圧力を感じることなく自由な意思で同意を示すことを意味します。
- 事前同意
- 事前に関係者の承認を取り付けることを指します。実施前に同意を得る点がポイントです。
- 情報提供付き同意
- 十分な情報を提供したうえで同意を得ること。理解と納得が前提になります。
- 情報に基づく同意
- 提供された情報を基に理解したうえで同意を決定すること。情報の透明性が重要です。
fpicの対義語・反対語
- 位置依存コード
- 実行時のロードアドレスに依存するコード。再配置(別の実行場所への移動)や共有ライブラリでの動的結合が難しくなることが多い。
- 非位置独立コード
- 位置に独立していないコード。ロード先のアドレスに強く依存するため、メモリ空間を自由に移動できない。
- 固定アドレス前提コード
- コードが固定のアドレスを前提として設計されている状態。再配置を前提としないため柔軟性が低い。
- 非PICコード
- PIC(位置独立コード)を生成していないコード。-fPIC の反対の概念として理解される。
- 静的リンク向けコード
- 主に静的リンクを想定して作られ、実行時の再配置が難しいケースが多い。
- デフォルトビルドの非PICコード
- ビルド設定によっては特別にPICを有効化していないデフォルトのコード。環境やツールチェーン次第で非PICになることがある。
fpicの共起語
- fPIC
- 位置独立コードを出力するコンパイルオプション。共有ライブラリ作成時に特に有用。
- PIC
- Position Independent Code の概念。コードがどのアドレスにも依存せず動作するよう生成されるコードの考え方。
- PIE
- Position Independent Executable の略。ASLR 対応の実行ファイルを指す概念。
- -fPIC
- コンパイラに渡すフラグで、-fPIC と同じく位置独立コードを出力する。
- -fPIE
- PIE 用のフラグ。実行ファイルを位置独立にする設定。
- -pie
- リンカに PIE 実行ファイルを作らせるオプション。
- ASLR
- Address Space Layout Randomization。実行時のアドレス配置をランダム化してセキュリティを高める。
- ELF
- Linux/Unix 系で使われる実行ファイル・共有ライブラリのファイル形式。
- 共有ライブラリ
- 動的リンク可能なライブラリ。複数のプログラムで共有して使える。
- 共有オブジェクトファイル .so
- .so は Linux などで使われる動的ライブラリの拡張子。
- ld
- リンク時にコードとデータを結合するツール。-shared などと組み合わせて動的リンクを作る。
- GCC
- GNU Compiler Collection の略。C/C++ などをコンパイルする代表的なツールチェーン。
- Clang
- LLVM ベースの C/C++ コンパイラ。GCC の代替として使われることが多い。
- C/C++
- fPIC/PIE は主に C/C++ のビルドで使われるコンパイルオプション。
- リロケーション
- 実行時にアドレスを再配置する作業。PIC/PIE/ASLR の根幹となる概念。
- アーキテクチャ
- PIC/PIE の挙動は CPU アーキテクチャ(例: x86_64, ARM)によって異なることがある。
- ビルド設定
- ビルドの設定全般。CFLAGS/CXXFLAGS などのフラグを含む。
fpicの関連用語
- fPIC
- Position Independent Code の略。メモリ上のロードアドレスに依存せずに実行できるようにするためのコード生成オプション。
- fpic
- fPIC の小文字バリエーション。同義で使われることが多いが、ツールや文書によって扱いが分かれることがある。
- PIC
- Position Independent Code の略。共有ライブラリや実行ファイルの再配置を容易にする設計思想。
- PIE
- Position-Independent Executable の略。実行ファイル自体が任意のアドレスへロードされても動作する形式。
- -fPIC
- GCC のフラグで、Position Independent Code を生成するためのオプション。
- -fPIE
- GCC のフラグで、PIE 用のコードを生成するオプション。
- -pie
- リンク時オプションで、出力を PIE にする設定。
- ELF
- Executable and Linkable Format の略。Linux などで使われる実行ファイル・ライブラリの標準フォーマット。
- Shared library (.so)
- 共有ライブラリ。動的にリンクされ、複数のプログラムで共有して使われるライブラリ。
- GOT
- Global Offset Table の略。動的リンク時の関数・変数の実参照先を管理するテーブル。
- PLT
- Procedure Linkage Table の略。外部関数の間接呼び出しを実現するテーブル。
- Relocation
- 再配置。実行時にアドレスを正しく結び付けるために、コード・データの参照先を調整する作業。
- ASLR
- Address Space Layout Randomization の略。実行時にメモリ配置をランダム化する安全機構。
- Dynamic linker/loader
- 動的リンカ/ローダ。共有ライブラリを実行時に解決・読み込む役割。
- ABI
- Application Binary Interface。バイナリ互換性の規約(関数呼び出し規約、データ型のサイズなど)を定める。
- Relocation types (ELF)
- ELF の再配置エントリの種類。例えば R_X86_64_RELATIVE など、アーキテクチャごとに異なる。
- 64-bit vs 32-bit
- 64ビット系と32ビット系でアドレス幅・命令セットが異なるため、PIC/PIE の扱いも異なる場合がある。
fpicのおすすめ参考サイト
- 概要-大阪ファミリー相談室とは - 公益社団法人家庭問題情報センター
- FPIC(エフピック)とは?
- FPIC(エフピック)とは?
- FPICの権利とは? | EcoNetworks
- 61 FPICとは - 熊本市 - 高石法律事務所



















