【问题标题】:How can I plant assembly instructions in the prologue and epilogue of function via gcc如何通过 gcc 在功能的序言和结尾中植入汇编指令
【发布时间】:2013-02-13 09:45:51
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 用gperf怎么样?
  • 我想构建分析器 - 这是我的学习项目 :)

标签: c gcc embedded


【解决方案1】:

显然您可以使用-finstrument-functions 标志让 gcc 生成检测调用

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

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

【讨论】:

  • 还要注意no_instrument_function 属性,该属性可用于 cyg_profile 函数本身以防止无限递归。
  • 绝对 - 我强烈建议事先掌握可用的在线文档和示例 - 正如我所说,从未亲自使用过它,但它看起来确实是可能拥有的那种东西许多与之相关的隐藏陷阱!
【解决方案2】:

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

  1. 预处理 C 代码本身 - 这并不容易,但也不是很困难。找到函数的开头和结尾,然后将代码添加到其中,然后让编译器适当地完成编写代码的工作......市场上有很多工具以一种或另一种方式做到这一点,例如多种用途[代码流分析、分析等]。
  2. 获取 gcc 的汇编器输出并对其进行处理,以便将代码添加到那里的函数中。这在某些方面更容易,在某些方面更难。识别函数可能不再困难,但“不破坏”汇编代码可能更难,除非您插入的汇编代码完全“安全”。

显然,修改gcc的选项也是一种可能,但是编译器代码相当复杂,除非你基本上把所有现有的gprof的钩子都拿走了,我不认为这是一个学校项目——除非你正在攻读博士学位或类似的学位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多