所以在网上搜索了一段时间后,我决定在这里尝试,因为它似乎是一个很好的讨论论坛。我试图创建一个简单的gcc插件。程序代码附在这封邮件的末尾,但用简单的英语来说,它注册了插件,并确保在注册pragmas时调用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
有人知道我做错了什么吗?
谢谢
这里有两个问题:
错误提示:"cannot load plugin plugin. "so"意味着你应该在你的LD_LIBRARY_PATH中添加你存储新共享库插件的目录。
如果您使用g++而不是gcc编译,那么您在包含中的所有文件中得到的数百个错误将在我的计算机中解决(不确定是否理解为什么认为)
您正在使用哪个版本的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++管理名称,例如execute_ipa_pass_list(opt_pass*)
而不仅仅是execute_ipa_pass_list
,您的GCC已经用c++编译器编译(可能是g++
)
所以你可能需要使用g++
(而不是gcc
)来编译你的GCC插件。
正如我所评论的,您是否考虑过使用MELT(一种扩展GCC的领域特定语言)来扩展或定制您的gcc
编译器?
我建议下载最新的http://gcc-melt.org/melt-plugin-snapshot.tar.bz2,因为我将在几周后发布GCC 4.7和4.8的下一个MELT
并且不要期望通过插件改变GCC的解析行为。这实际上是不可能的(GCC只提供插件钩子来添加内置和pragmas,而不是扩展解析的语法)。