使用带有交叉编译器的gcc插件,未定义符号
我试图看看是否有可能在ARM交叉编译器(ARM-none-eabi-gcc)中使用gcc插件。然而,我遇到了编译器错误,我怀疑我所尝试的是否可行 我正在尝试设置的插件是: 我在x86-64 linux上使用使用带有交叉编译器的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_
-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