使用带有交叉编译器的gcc插件,未定义符号

使用带有交叉编译器的gcc插件,未定义符号,gcc,arm,cross-compiling,gcc-plugins,Gcc,Arm,Cross Compiling,Gcc Plugins,我试图看看是否有可能在ARM交叉编译器(ARM-none-eabi-gcc)中使用gcc插件。然而,我遇到了编译器错误,我怀疑我所尝试的是否可行 我正在尝试设置的插件是: 我在x86-64 linux上使用-m32标志编译插件,因为交叉编译器是32位应用程序。但是,当我尝试使用-fplugin在交叉编译器中使用插件时,我得到一个未定义的符号编译器错误: cc1plus:错误:无法加载插件../afl-gcc-pass.so ../afl-gcc-pass.so:未定义符号:_z13构建_int_

我试图看看是否有可能在ARM交叉编译器(ARM-none-eabi-gcc)中使用gcc插件。然而,我遇到了编译器错误,我怀疑我所尝试的是否可行

我正在尝试设置的插件是:

我在x86-64 linux上使用
-m32
标志编译插件,因为交叉编译器是32位应用程序。但是,当我尝试使用
-fplugin
在交叉编译器中使用插件时,我得到一个未定义的符号编译器错误:

cc1plus:错误:无法加载插件../afl-gcc-pass.so
../afl-gcc-pass.so:未定义符号:_z13构建_int_cstP9tree_节点

我使用
nm
查看了插件的符号,发现大多数符号都是未定义的,包括
exit
random
。我对这些都是新手,不确定这到底意味着什么。一些在线搜索表明,这可能与不正确的库路径有关,但设置
library\u PATH
LD\u library\u PATH
和重建似乎没有帮助

我尝试过的gcc版本设置:

ubuntu 16.04上的1:x86:5.4.0、arm:5.4.1

CentOS 6.8上的2:x86:5.2.0、arm:5.2.1


有没有可能在不同的gcc中使用gcc插件,或者我是在浪费时间

是的,可以使用给定的编译器构建gcc插件,然后在另一个编译器(包括交叉编译器)中使用该插件,但在构建插件时必须确保包含正确的头文件。 具体来说,您必须包含目标编译器的插件开发头文件,而不是宿主编译器的头文件。可以使用以下命令获取目标编译器的插件开发文件所在的目录:

$(TARGET_CC) -print-file-name=plugin
其中,
$(TARGET_CC)
是您的目标编译器。因此,在构建插件时,在编译器标志中指定相关include目录的简洁方法类似于
-I“$(shell$(TARGET_CC)-print file name=plugin)/include“

对于您尝试使用的特定插件(afl fuzz的指令插入),为了为交叉编译器构建插件,您可以修改gcc_plugin文件夹中的Makefile;更具体地说,您可以定义一个包含交叉编译器路径的
TARGET\u CC
变量,然后在
PLUGIN\u FLAGS
的定义中将
$(CC)
替换为
$(TARGET\u CC)
,如下所示:

PLUGIN_FLAGS = -fPIC -fno-rtti -I"$(shell $(TARGET_CC) -print-file-name=plugin)/include"
您还必须注释掉在
test\u build
Makefile目标中执行的命令,因为这些命令会尝试将插件与本机编译器一起使用,因此会失败。 然后,您将能够在交叉编译器中使用该插件,如中所示:

arm-none-eabi-gcc -fplugin=../afl-gcc-pass.so --specs=nosys.specs my_source_file.c