问题标签 [gcc-plugins]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 调试 gcc 插件
我目前正在为 gcc (9.2) 编写一个插件,并且正在寻找一种调试所述插件的方法。为此,我使用这些说明构建了 gcc ,以启用 gcc 的调试符号。然后我尝试通过使用以下命令在 gdb 中调用 gcc 来调试插件:
./xg++ -wrapper gdb,--args -fplugin=plugin_name.so
这导致我能够单步执行 gcc 本身,看到它的符号。但是,我无法访问插件符号。该插件使用 -g 标志编译。
我还需要做什么才能逐步完成插件的代码?
gcc - 使用带有交叉编译器的 gcc 插件,未定义的符号
我正在尝试查看是否可以在 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
并发现大多数符号是未定义的,包括exit
和random
. 我对其中的大部分内容都很陌生,不确定这到底意味着什么。一些在线搜索表明它可能与不正确的库路径有关,但设置LIBRARY_PATH
和LD_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 插件,还是我在浪费时间?
c - 已解决:使用 linux 内核源代码树中的 gcc 插件构建程序时出错
我正在尝试使用我在他们的非官方 linux 内核源代码树(那个respectre_plugin/
)上找到的 grsecurity gcc 插件。我的 GCC 版本是 4.7,我进行了修改scripts/gcc-plugins/Makefile
以使其编译插件,并使用根 Makefile 构建它,make gcc-plugins
没有显示错误。然后,当我尝试编译具有类似 Spectre 缺陷的 C 文件时,出现以下构建错误:
file.c:36:31: error: array_index_mask_nospec is not defined
这个函数在 中定义respectre_plugin/respectre_plugin.c
,我不知道为什么会出现这个奇怪的构建错误,如果有人知道的话......我的构建调用如下:
gcc -Wall -Wextra -std=c99 -fplugin=/path/to/respectre_plugin.so -c file.c -o file.o
谢谢你的帮助 !
c - 如何使用检测代码将汇编代码添加到所有功能的序言和结尾?
每个人。
我正在开发一个 C 项目,我需要一种在源代码中每个函数的序言和结尾添加汇编代码的方法。
让我给你举个例子。
这是源代码:
相对的汇编代码是这样的:
现在我想做的是找到一种方法,在我编译时自动将我的汇编代码添加到序言和尾声中。然后得到这样的情况:
我对此做了很多研究。而且我找不到任何可以解释如何做到这一点的东西。
我知道 gcc 编译器提供了-finstrument-functions
检测函数的选项,但这不是我需要的。那是因为该选项涉及添加以下两个功能:
在相关程序集中,结果是对这些函数的调用,这不是我想要的。
我已经通过 gcc 插件阅读过,也许你可以得到这个结果,但是文档真的很差。
我还阅读了一些关于DynamoRio的内容,但我认为我需要的是静态而不是动态的仪表系统。
有人可以指出我正确的方向吗?谢谢大家!
c++ - GCC 插件:是否可以将一个函数的基本块序列移动到另一个函数的基本块?
我正在尝试为 gcc 创建一个插件,该插件允许您检测函数的序言和结尾。
检测代码插入到两个函数“instrument_entry”和“instrument_exit”中。这两个函数写在一个名为 instrumentation.h 的文件中,该文件包含在我要检测的软件的源代码中。-finstrument-function
简而言之,它与gcc 的非常相似
与 gcc 提供的选项不同,通过插件,我想获取函数“instrument_entry”中存在的代码(我检查过,这个函数只包含一个基本块)并将其插入到函数中存在的所有其他序言中软件。
我想将函数“instrument_entry”的基本块中存在的序列插入到要检测的函数的第一个基本块中。
这是代码:
bb_entry_instr
是“instrument_entry”函数的基本块
我为 gcc 创建的 pass 在 "cfg" pass 之后调用:
当我尝试使用该插件编译测试程序时,出现此错误:
有人可以帮助我吗?
gcc - GCC插件编译问题
我正在尝试交叉编译一个自定义内核模块(来自这个 git),它依赖于一个最初在 git 中编译的插件(它在 $git/buildtools/gcc-nexmon-plugin/nexmon.c 中)。
本来这个树是打算直接建在树莓派上的,但是我想把这个特性移植到一个buildroot系统上,也就是说,我的树莓派上没有gcc/g++,我只在树莓派上交叉编译我的笔记本电脑。
我的问题是如何正确创建 nexmon.so (插件文件),以便我以后可以在交叉编译时使用它
生成 nexmon.so 的原始命令行是:
如您所见,它们在树中包含了一些交叉编译器(“../gcc-arm..”)。
现在我明白插件不应该被交叉编译。请记住,他们希望我们在树莓派上运行它,所以“g++”是嵌入的“g++”。在我这边,我必须运行我的笔记本电脑的“g++”。
不幸的是,我似乎无法让它在我的笔记本电脑上工作,这就是我现在正在尝试的:
因为我目前使用的是g++ 8.3.0-6,并且我找到了相应的插件开发头文件。如果我运行它,我会遇到很多问题,
- “在包含的插件/include/tree.h 文件中:#error Unknown BITS_PER_UNIT”
- “在包含的插件/include/cpplib.h 文件中:#error 找不到至少 32 位有符号整数类型”
这让我觉得我缺少一些标志来正确定义我的笔记本电脑架构- 但我可能是错的。
这是我的错误的完整 PasteBin:输出日志
我想我确实有构建插件的东西,因为 gcc8/plugin/include 存在。我尝试安装“gcc-multilib,gcc-8-plugin-dev-i686-linux-gnu,gcc-8-plugin-dev-x86-64-linux-gnux32,gcc-8-plugin-dev”。我无法回到以前的 gcc(如 4.8、5、6、7),因为我所有的 debian 升级都删除了它们,它们不再使用
任何帮助将不胜感激,到目前为止,没有人能够帮助我,而且我的想法已经用完了。这一点完全阻碍了我的项目。