GCC插件入门

GCC插件入门,gcc,undefined,symbols,gcc-plugins,Gcc,Undefined,Symbols,Gcc Plugins,所以在网上搜索了一段时间后,我决定试试这里,因为它似乎是一个很好的讨论论坛。我正在尝试创建一个简单的gcc插件。程序代码附在本邮件的末尾,但用简单的英语,它会注册插件,并确保在注册pragma时调用pragma_init函数。就是在这里,我使用c_register_pragma来截取一些pragma 我使用中的示例编译它。汇编和链接工作做得很好。但是,当我加载插件时,我得到: gcc -c -fplugin=plugin.so test.c -o test.o cc1: error: c

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

我使用中的示例编译它。汇编和链接工作做得很好。但是,当我加载插件时,我得到:

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个其他错误中):

有人知道我做错了什么吗


谢谢你

你在使用哪个版本的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编译器。 您可以通过运行

nm -D -C $(gcc -print-file-name=cc1) 

如果该命令显示了类型C++ C++的名字,例如代码> ExuTeTyIIPaPASSURLIST(OPTTPASS*)而不是仅<代码> ExeUTTeIIApPaseListList<代码>您的GCC已经用C++编译器编译(可能是代码> G++<代码> < < /P>) 因此,您可能需要使用

g++
(而不是
gcc
)来编译您的gcc插件

正如我所评论的,您是否考虑过使用(特定领域的语言来扩展GCC)来扩展或自定义您的代码> GCC < /代码>编译器?< /P> 我建议下载最新版本,因为我将在几周后发布GCC4.7和4.8的下一个MELT


不要期望通过插件改变GCC的解析行为。这实际上是不可能的(GCC只提供插件挂钩来添加内置和杂注,而不是扩展解析的语法)。

这里有两个问题:

错误:“无法加载plugin plugin.so”意味着您应该将存储新共享库插件的目录添加到您的LD_LIBRARY_路径中


<>你在我的计算机中解决了所有的文件中的错误,如果你用G++编译而不是GCC(不知道为什么思考)

你是否认为使用GCC在GLAST(一个特定领域的语言来扩展GCC)是编码的?而不是痛苦地在GC++中制作GCC插件?什么是输出?> GCC-V < /代码>?-V的输出(编译插件时)is:collect2--eh frame hdr-m elf_x86_64-shared-o plugin.so/lib//lib64/crti.o/gcc-48/lib/gcc/x86_64-unknown-linux-gnu/4.8.0/crtbeginS.o-L/gcc-48/gcc/x86_64-unknown-linux-gnu/4.8.0/../../../../../../../../../lib64-L/lib/lib64-lib/lib-L/gcc-48/lib/gcc/x86_64-unknown-linux-gnu/4.8.0/../../../。。plugin.o-lgcc--as needed-lgcc_s--no as needed-lc-lgcc--as needed-lgcc_s--no as needed/gcc-48/lib/gcc/x86_64-unknown-linux-gnu/4.8.0/crtrends.o/lib/./lib64/crtn.oI删除了一些路径,因为消息太长。我更喜欢用C/C++编写我的东西,而不是熔化。部分原因是我不太了解Melt,但也因为我计划做的一些事情将从插件本身进行解析。不,只运行命令
gcc-v
,不带任何其他参数。COLLECT\u gcc=gcc COLLECT\u LTO\u WRAPPER=/home/rb/Tools/gcc-48/libexec/gcc/x86\u 64-unknown-linux-gnu/4.8.0/LTO-WRAPPER目标:x86\u 64-unknown-linux-gnu配置为:../gcc-4.8.0/configure---prefix=/home/rb/Tools/gcc-48--禁用多库线程模型:posix gcc版本4.8.0(gcc)谢谢你,巴兹尔。我确实安装了一个插件开发包(使用FC17),现在插件被加载并输出正确的消息。但是,我确实恢复了在系统上预安装的编译器。使用GCC4.8是否需要采取额外的预防措施?也许我错过了一些旗帜。尽管如此,它似乎至少在预构建4.7中起作用。再次感谢您的支持。出于好奇,您愿意开发什么样的GCC插件?一个在与我的运行时系统交互的应用程序(想想OpenMP、StarPU、OMPS、OpenStream、XKaapi等)中支持并行化的插件。手动对应用程序进行代码转换以使用我正在试验的功能有点痛苦。我很乐意看到更多的细节,至少通过电子邮件给我(然后提及你问题的URL)。谢谢
nm -D -C $(gcc -print-file-name=cc1)