2

我正在尝试查看是否可以在 ARM 交叉编译器(arm-none-eabi-gcc)中使用 gcc 插件。但是,我遇到了编译器错误,并且质疑我正在尝试做的事情是否可行。

我要设置的插件是:https ://github.com/vanhauser-thc/AFLplusplus/tree/master/gcc_plugin

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

cc1plus: error: cannot load plugin ../afl-gcc-pass.so ../afl-gcc-pass.so: undefined symbol: _Z13build_int_cstP9tree_nodel

我查看了插件的符号 usingnm并发现大多数符号是未定义的,包括exitrandom. 我对其中的大部分内容都很陌生,不确定这到底意味着什么。一些在线搜索表明它可能与不正确的库路径有关,但设置LIBRARY_PATHLD_LIBRARY_PATH重建似乎没有帮助。

我尝试过的 gcc 版本设置:

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

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

是否可以在与编译时不同的 gcc 中使用 gcc 插件,还是我在浪费时间?

4

1 回答 1

2

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

$(TARGET_CC) -print-file-name=plugin

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

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

PLUGIN_FLAGS = -fPIC -fno-rtti -I"$(shell $(TARGET_CC) -print-file-name=plugin)/include"

您还必须注释掉在test_buildMakefile 目标中执行的命令,因为这些命令会尝试将插件与本机编译器一起使用,因此会失败。然后,您将能够将该插件与您的交叉编译器一起使用,如下所示:

arm-none-eabi-gcc -fplugin=../afl-gcc-pass.so --specs=nosys.specs my_source_file.c
于 2020-02-05T17:37:31.267 回答