テーマ:Linux
共有ライブラリのコンパイル時に以下のようなエラーが発生。
relocation R_X86_64_32 against `__gxx_personality_v0' can not be used when making a shared object; recompile with -fPIC
./test.o: could not read symbols: Bad value
collect2: ld はステータス 1 で終了
・ビルドした環境
CentOS 64bit(VM)
バージョン:CentOS Linux release 6.0 (Final)
内容的には-fPICを指定しろやーということで
実際に指定したらエラーもなくなり、soファイルが無事生成できたが
-fPICってなんだろうと思ったのでちょっと調べてみた。
・見つけたサイト
bkブログ Linux の共有ライブラリを作るとき PIC でコンパイルするのはなぜか
→http://0xcc.net/blog/archives/000107.html
PIC版、非PIC版のデメリットが書かれている。
PIC版
→非PIC版より再配置に時間がかからない(だいぶ違う)
→exportされた関数をライブラリ内で呼び出す場合、PLT を経由するため
それらの関数呼び出しが遅くなる
非PIC版
→他のプロセスとテキストが共有できない
デバッグについても記載されていた。
bkブログ ltrace で共有ライブラリの関数呼び出しをトレースする
→http://0xcc.net/blog/archives/000103.html
・PIC (Position Independent Code)
任意のアドレスにロード可能なコードのこと。データのアクセスやジャンプは相対アドレスで行われます。
参考:http://d.hatena.ne.jp/mir/20070704/p1
・PLT (Procedure Linkage Table)
共有ライブラリの関数を呼び出す時に必ず経由するコードが各関数ごとに用意されている
・その他
共有ライブラリーを解剖する
→http://www.ibm.com/developerworks/jp/linux/library/l-shlibs/
今回共有ライブラリを初めて作ったんだけど
どうやって動いているか、事前に調べが少なかったと反省…。
PR
同じテーマの記事
- CentOS6.0 最小構成でインスト… 10月20日