gpt4 book ai didi

gcc - 使用带有交叉编译器的 gcc 插件, undefined symbol

转载 作者:行者123 更新时间:2023-12-04 10:39:19 25 4
gpt4 key购买 nike

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

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

我正在使用 -m32 在 x86-64 linux 上编译插件标志,因为交叉编译器是 32 位应用程序。但是,当我尝试使用 -fplugin 在交叉编译器中使用该插件时,我收到一个 undefined symbol 编译器错误:
cc1plus: error: cannot load plugin ../afl-gcc-pass.so
../afl-gcc-pass.so: undefined symbol: _Z13build_int_cstP9tree_nodel

我使用 nm 查看了插件的符号并发现大多数符号都是未定义的,包括像 exit 这样的符号。和 random .我对其中的大部分内容都很陌生,不确定这到底意味着什么。网上有的搜索提示可能与库路径不正确有关,但是设置了LIBRARY_PATHLD_LIBRARY_PATH重建似乎没有帮助。

我尝试过的 gcc 版本设置:

1: x86: 5.4.0 , arm: 5.4.1 在 ubuntu 16.04

2: x86: 5.2.0 , arm: 5.2.1 在 CentOS 6.8

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

最佳答案

是的,可以使用给定的编译器构建 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_build 中执行的命令。 Makefile 目标,因为这些命令会尝试将插件与 native 编译器一起使用,因此会失败。
然后,您将能够在交叉编译器中使用该插件,如下所示:
arm-none-eabi-gcc -fplugin=../afl-gcc-pass.so --specs=nosys.specs my_source_file.c

关于gcc - 使用带有交叉编译器的 gcc 插件, undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60009446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com