GCC插件入门

时间:2013-04-11 12:07:27

标签: gcc plugins undefined symbols

所以在网上搜索了一段时间后,我决定尝试这里,因为它似乎是一个讨论的好论坛。我试图创建一个简单的gcc插件。程序代码附加在此邮件的末尾,但简单地说它注册了插件并确保在注册pragma时调用pragma_init函数。在这里,我使用c_register_pragma来拦截一些pragma。

我使用http://gcc.gnu.org/onlinedocs/gccint/Plugins-building.html#Plugins-building中的示例编译它。编译和链接工作正常。但是,当我加载插件时,我得到:

gcc -c -fplugin=plugin.so   test.c -o test.o 

cc1: error: cannot load plugin plugin.so

plugin.so: undefined symbol: warning

我做错了什么?此外,当包含一些头文件(稍后将需要)时,我会遇到很多错误。例如,包括“tree.h”产生(在50个其他错误中):

/machmode.h:262:1: error: unknown type name 'class'

 class bit_field_mode_iterator
 ^
/machmode.h:263:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token

 {
 ^
/plugin/include/tree.h:27:0,
             from conftest.c:63:

/vec.h:220:8: error: field 'register_overhead' declared as a function

任何人都知道我做错了什么?

谢谢

2 个答案:

答案 0 :(得分:3)

这里有两个问题:

错误:“无法加载插件plugin.so”意味着您应该在LD_LIBRARY_PATH中添加存储新共享库插件的目录。

如果使用g ++而不是gcc进行编译,那么使用include中的所有文件得到的数百个错误都会在我的计算机中得到解决(不确定为什么会这么想)

答案 1 :(得分:2)

您使用哪个版本的GCC来编译插件和使用插件?简单地运行

 gcc -v

没有任何其他程序参数可以找到!

您是否为GCC插件开发安装了相应的软件包(在Debian或Ubuntu上,可能是gcc-4.7-plugin-dev,但是将4.7版本调整为您特定版本的GCC)?

您是否安装了构建GCC所需的所有依赖项(在Debian或Ubuntu上,apt-get build-dep gcc-4.7 gcc-4.7-plugin-dev)?

GCC的最新版本(特别是发行版提供的许多GCC 4.7,以及所有GCC 4.8)都是由C ++编译器编译的,而不是C编译器。

您可以通过运行

来检查您的 GCC 是如何构建的(在C或C ++中)
nm -D -C $(gcc -print-file-name=cc1) 

如果该命令显示类型化的C ++管理名称,例如您使用C ++编译器(可能是execute_ipa_pass_list(opt_pass*))编译了execute_ipa_pass_list而不仅仅是g++您的GCC

因此,您可能需要使用g++(而非gcc)来编译您的GCC插件。

正如我评论的那样,您是否考虑使用MELT(一种特定于域的语言来扩展GCC)来扩展或自定义您的gcc编译器?

我建议下载最新的http://gcc-melt.org/melt-plugin-snapshot.tar.bz2,因为我将在几周后发布GCC 4.7和4.8的下一个MELT

并且不要期望使用插件更改GCC的解析行为。这是不可能的(GCC只提供插件钩子来添加你的内置和编译指示,而不是扩展解析的语法)。