うわのブログ

へたれプログラマーのメモが中心です。


テーマ:

共有ライブラリのコンパイル時に以下のようなエラーが発生。

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
同じテーマの記事

気になるキーワード