2013年06月27日
GCC のプラグインを作ってみる
環境は、同じく Ubuntu Linux 12.04 64bit で、PPA レポジトリに apt-get のパスが通っていることと、GCC 4.7 がインストール済みであることを前提にします。
プラグインをビルドするためには、GCC のヘッダなどが必要です。Ubuntu の PPA から apt-get でインストールできたので、非常に楽でした。ヘッダのパスは -print-file-name=plugin で確認できます。
追記: プラグインは GCC 4.5 から gcc-4.5-plugin-dev をインストールすれば使えるようです。PPA は不要で、素の Ubuntu の GCC でも動きそうです。(未確認)
まずは、以下のような、何もしない、最小限のプラグインを書いてみました。(test_gcc_plugin.c)
プラグインをビルドするためには、GCC のヘッダなどが必要です。Ubuntu の PPA から apt-get でインストールできたので、非常に楽でした。ヘッダのパスは -print-file-name=plugin で確認できます。
$ sudo apt-get install gcc-4.7-plugin-dev $ gcc-4.7 -print-file-name=plugin /usr/lib/gcc/x86_64-linux-gnu/4.7/plugin(プラグインをサポートしてないバージョンの GCC や、プラグインの SDK がインストールされていない場合、単に "plugin" としか表示されません。これで Makefile 中などでエラーチェックができそうです。)
追記: プラグインは GCC 4.5 から gcc-4.5-plugin-dev をインストールすれば使えるようです。PPA は不要で、素の Ubuntu の GCC でも動きそうです。(未確認)
まずは、以下のような、何もしない、最小限のプラグインを書いてみました。(test_gcc_plugin.c)
#include "gcc-plugin.h" /* must be the first */ #include "tm.h" /* main_input_filename */ #include <stdio.h> int plugin_is_GPL_compatible; /* gcc_data - event-specific data provided by GCC user_data - plugin-specific data provided by the plug-in. */ void test_callback(void *gcc_data, void *user_data) { printf("enter %s()\n", __func__); printf("main_input_filename: %s\n", main_input_filename); } int plugin_init(struct plugin_name_args *info, struct plugin_gcc_version *version) { if (info != NULL) { printf("base_name: %s\n", info->base_name); register_callback(info->base_name, PLUGIN_ALL_PASSES_START, test_callback, NULL/* user_data */); } return 0; }以下のようにしてコンパイルし、gcc-4.7 に読み込ませると、とりあえずちゃんと動いていることが確認できました。(コンパイルする C ファイルは何でも構いません。)
$ gcc-4.7 -I`gcc-4.7 -print-file-name=plugin`/include -fPIC -shared -O2 test_gcc_plugin.c -o test_gcc_plugin.so $ gcc-4.7 -fplugin=./test_gcc_plugin.so test.c base_name: test_gcc_plugin enter test_callback() main_input_filename: test.cGCC の内部構造に触りたい時、本体に patch を当ててビルドする必要が無いので、これはとても楽ですね!