如何通过gcc在功能的序言和尾声中植入装配指令

如何通过gcc在功能的序言和尾声中植入装配指令,c,gcc,embedded,C,Gcc,Embedded,我尝试为某个c项目构建探查器。 我希望gcc在编译时在所有函数条目和函数出口点中植入一些汇编指令。 我试图在网上搜索一些指南,但没有成功。 我在哪里可以学会如何做到这一点 提前感谢。除非您想修改gcc(这是非常重要的!),否则我认为有两种相当明显的方法 对C代码本身进行预处理——这并不容易,但也不是很难。找到函数的开头和结尾,并将代码添加到其中,然后让编译器正确地完成生成代码的工作。。。市场上有相当多的工具以这样或那样的方式实现这一点,用于各种目的[代码流分析、评测等] 获取gcc的汇编程序输出

我尝试为某个c项目构建探查器。 我希望gcc在编译时在所有函数条目和函数出口点中植入一些汇编指令。 我试图在网上搜索一些指南,但没有成功。 我在哪里可以学会如何做到这一点


提前感谢。

除非您想修改
gcc
(这是非常重要的!),否则我认为有两种相当明显的方法

  • 对C代码本身进行预处理——这并不容易,但也不是很难。找到函数的开头和结尾,并将代码添加到其中,然后让编译器正确地完成生成代码的工作。。。市场上有相当多的工具以这样或那样的方式实现这一点,用于各种目的[代码流分析、评测等]
  • 获取gcc的汇编程序输出,并对其进行处理,以便向其中的函数添加代码。这在某些方面更容易,在某些方面更难。识别函数可能不再困难,但除非插入的汇编代码完全“安全”,否则“不破坏”汇编代码可能更难

  • 显然,修改
    gcc
    的选项也是可能的,但是编译器代码相当复杂,除非您基本上使用
    gprof
    的所有现有挂钩,我不认为这是一个学校项目,除非你正在攻读博士学位或类似的课程。

    显然,你可以使用
    -finstrument functions
    标志让gcc生成插装调用

    void __cyg_profile_func_enter(void *func, void *callsite); 
    void __cyg_profile_func_exit(void *func, void *callsite); 
    

    在函数入口和出口处。我从未使用过这个,但快速搜索会显示信息和示例。

    使用gperf如何?我想构建探查器-这是我的研究项目:)还要注意
    no\u instrument\u函数
    属性,可以在cyg_profile函数本身上使用,以防止无限递归。绝对-我强烈建议事先处理好在线文档和示例-正如我所说,从未亲自使用过,但它看起来确实像是一种可能有许多隐藏陷阱的东西!