Cコンパイラのgccコンパイラやg++(C++のコンパイラ)でよく使われる -fPIC オプションと -fpic オプションの違いについてまとめました。また、-fPIC オプションをつけた場合、どのようなアセンブリ言語が生成されるのか、確認しました。 読み方 pic ぴっく position-independent code ぽじしょん いんでぃぺんでんと こーど 概要 Unixでプログラムをビルドしている最中に流れてくるメッセージをみていると、cc(gcc)のコンパイルオプションに -fPIC というオプションがついていることに気がつくと思います。 gccには、-fPIC のほかに -fpic というオプションもあります。小文字か大文字かの違いがありますが、一体何が違うのでしょうか? まず、 -fPIC について解説し、そのあと -fPIC と -fpic の違いについて説明します。 -
The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Java, and Ada, as well as libraries for these languages. GNUプロジェクトおよびGCCデベロッパチームは5月2日(協定世界時)、「GCC 7.1 Released」において、GNU Compiler Collectionの最新メジャーリリースとなる「GNU Compiler Collection 7.1」の公開を伝えた。GCCデベロッパーチームでは今月をもってGNU Compiler Collection 1.0がリリースされてから30年が経過したと説明している。 「GNU Compiler Collection 7.1」はGNU Compiler Collection
Linuxで共有ライブラリ(*.so)を作るようになったのでちょっと勉強してみた。今までは使うだけだったので、以下のようなことは知っていた。作るときはgccの-sharedオプションを使う。使うときはgccの"-lライブラリ名"でリンクするライブラリを指定する。リンク時のライブラリ探索パスは-Lオプションで指定する。実行時のライブラリ探索パスは/etc/ld.so.confに書いてあるディレクトリ。環境変数LD_LIBRARY_PATHでも指定可能。ライブラリを作るときは、.cから.oを作るときに-fPICをつけるといいらしい。新しくライブラリを入れたときはldconfigするといいらしい。逆に今まであまり知らなかったこと。ほとんどのライブラリはlibhoge.so, libhoge.so.1, libhoge.so.1.1のように3つくらいのファイルがあり、libhoge.soやlibh
Linux の共有ライブラリを作るとき PIC でコンパイルするのはなぜか 通常、Linux の共有ライブラリを作るときは各 .c ファイルを PIC (Position Independent Code) となるようコンパイルします。しかし、実は PIC でコンパイルしなくても共有ライブラリは作れます。それでは PIC にする意味はあるのでしょうか。 さっそく実験してみます。 int func () { printf(""); printf(""); printf(""); } PIC でコンパイルするには gcc に -fpic または -fPIC を渡します。-fpic の方が小さく高速なコードを生成する可能性がありますが、プロセッサによっては -fpic で生成できる GOT (Global Offset Table) のサイズに制限があります。一方、-fPIC はどのプロセッサで
gccとはbash同様FSFのGNUプロジェクトによって開発されたコンパイラでGNU C Compiler、後にC/C++/Objective C/FORTRAN/Java...といった各種プログラミング言語に対応したことからGNU Compiler Collectionとして知られています。 コンパイルの過程 コンパイラとコンパイルではUNIX/Linux及びシェル環境におけるコンパイラとコンパイルについてccとgccの関係、続くUNIX/Linux C コンパイル過程では、実行ファイルができるまでに具体的に何が行われているのかについて、その流れを追いました。 そして実際にgccでコンパイルと中間ファイルの残し方、更にstatic library/スタティックライブラリ/静的ライブラリ(拡張子.a/archive/アーカイブ)ファイルの作成とリンクによる実行ファイルの作成をしてみました。
最近の gcc だとシンボル解決がうまくいかないといかないことがあったので、ちょっと調べました。 次のような 3つのソースファイルがあったとして、ダイナミックリンクで作ってみましょう。 `main.c` int foo(void); int main(void) { return foo() + 1; } `foo.c` int bar(void); int foo(void) { return bar() + 1; } `bar.c` int bar(void) { return 0; } shared object を作るのに必要なのは、コンパイル時に `-fPIC` オプションをつけることと、リンク時に `-shared` オプションをつけることの 2点です。 $ gcc -fPIC -c -o bar.o bar.c $ gcc -shared -o libbar.so bar.o
シフトJISのソースをコンパイルするとき、コメントの行末が「能」だったりすると出る。 gccのワーニング usart.h:18:1: warning: multi-line comment 問題のソース 17: // ========================== 18: // 変更可能 19: // ========================== 原因 SJISの「能」は 0x94,0x5C であるため。 0x5C は ASCIIでは \ になるので、次の行とくっつく 対策 gccのオプションに --input-charset=cp932 をつける http://www.google.co.jp/search?q=cache:http://twistbendcoupling.net/2006/04/blog-post_16.html http://ja.wikipedia.o
Googleが昨年発表したオープンソースのプログラミング言語「Go」が早ければGCC 4.5でマージされることが明らかになった。 GNU Compiler Collection(GCC)を監督するGCC Steering Committeeは1月26日、米Googleの「Go」をサポートする方針を発表した。早ければ「GCC 4.5」でマージされるという。 Goは、Googleが2009年11月に発表したオープンソースのプログラミング言語。Pythonのような動的言語の開発スピードと、CやC++のようなコンパイル言語の性能を併せ持つことを目的とする。 GCCは今後、gccgoフロントエンドとgccランタイムの貢献を受け付けマージを進める。メンテナーはGoogleのイアン・タイラー氏。サポートはGCC 4.5以降となり、GCCリリースマネジャーがコンパイラにマージする時期などを決定する。 GC
今年の文化祭で書いた記事です。 - C言語といえば、いやなイメージ、過去の遺産といった感じがあるかもしれません。 C言語のネガティブな側面というと、やはりポインタやメモリ管理などが難しい、ということが思いつくかもしれません。 しかし、C言語のポインタは表記に騙されやすいだけで、仕組み自体は全く難しくありません。 文法も、どこぞのPerlやC++と比べたら屁でもない単純さです。 実のところ、仕様が煩雑で難しいのは、Cプリプロセッサなのであります。 普段からあまり複雑な使いかたをしないから気づかないかもしれませんが、Cプリプロセッサの置換処理は、欺瞞と裏切りに満ちた世界なのです。 これが進化するとテンプレートなどといったもっと面白いものになるのですが、今回はCプリプロセッサで計算をしちゃったりするところまで試しにやってみましょう。 (なお、GCCにより実験的に調べた記事なので、他のCコンパイラ
State of the art C compiler optimization tricks, Felix von Leitner, Linux Kongress 2009. 最近のCコンパイラーの最適化能力についてまとめたプレゼンテーション。定数の扱いやインライン展開などの基本的な項目から始まって,分岐の削除やベクトル化, SIMD 化など,最新のコンパイラーに搭載されている様々な機能について調べている。 この手の分岐の削除はほとんどのコンパイラーで有効らしい。 ベクトル化については gcc がだいぶ頑張っている印象。 「gcc は全プラットフォームにおいてビデオコーデックプログラマーより賢い」 これらの最適化が実際のコードでどのように機能するか気になって逆アセンブリコードを覗いてみる人も少なくないと思うけれど,それを代わりにやってくれた感じだ。この手の話題に興味がある人ならば,目を通
ゆとりなもので,ついこないだまで動的リンクと静的リンクの違いがわかっていなかった.動的リンクというのが理解できた頃,そっかユーティリティライブラリは自分で共有ライブラリ作ってしまえばいいんだ,というごく当たり前のことが理解できた. UNIXをさわりはじめていた初期の頃,mecab.soのシンボリックが〜〜という用なハマりがあったのだけれど,あれは要するに実行時に共有ファイルへのパスを指定してあげればよかっただけのこと. わかると当たり前だけれど,わからないと「何がわからないのかわからない」状態に落ち込むなぁ,と改めて思いました. (幸いなことに,僕の周りには「ゆとり乙ww」と指導してくれる方々がいるので認識できるようになるのですが,少なくとも大学(院)時代はそうでなかったわけで,ゆとりスパイラルの恐ろしさを体感した気がしています.) というわけで自分用共有ライブラリの作り方をきちんと理解で
702NK (1) 705NK (1) Activity (1) Adapter (2) add-on (1) AES (1) agile (3) amazon (2) Android (19) Android Studio (1) arm (2) assembler (1) bash (2) Bluetooth (2) book (3) bridge (1) C (13) cache (2) canna (1) catch.com (1) codereview (4) CPU (3) cruisecontrol (1) current (1) cygwin (1) debian (2) debug (2) dictionary (1) disklabel (2) distcc (2) DMA (2) Dropbox (1) embedded (2) encfs (1) english (
●コンパイル過程の詳細 ここでは,C/C++のソースから実行バイナリを作成することの全体を指して 広義的にコンパイルと呼んでいますが,このコンパイルは, プリプロセッサの処理・狭義のコンパイル・アセンブル・リンクという過程から 成り立っています. gccを起動すれば,これらの必要な過程が自動的に実行されます. gccというのは,実は「ドライバ」と呼ばれるプログラムであり, gcc自身はコンパイルなどの実作業を何も行なわず, gccの内部から,実際にコンパイル・アセンブル・リンクなどを行なうコマンドを 呼び出すことによって一連のコンパイル動作を行なっているのです.(下図) ここで,途中のcc1またはcc1plusの部分は, ソースファイルがC言語かC++かによって変わります. C++の場合は,gccで起動した場合でもcc1plusが呼び出されます. +-----+ | cpp | Cプリプロ
静的ライブラリのリンク時にundefined referenceエラーが出る(gcc) 概要 gccでリンク時にundefined referenceエラーが出る場合がある。 通常はオブジェクトやライブラリの指定忘れが原因であるが、 静的ライブラリをリンクする順番に間違いがあって出る場合もある (自分でMakefileを書く場合にこのミスをすることが多い) リンクの順番には依存性があり、あるオブジェクトが静的 ライブラリ内の関数を呼び出すときには呼び出される側の ライブラリは「後で」リンクする必要がある。 例えば foo.o が静的ライブラリ libfoo.a 内の関数を使用している、つまり foo.o → libfoo.a という依存関係があるとき、 g++ -o foo libfoo.a foo.o とするとundefined referenceエラーが出る。従って g++ -o fo
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く