让 gcc 在 c 操作之间调用特定的函数

Posted

技术标签:

【中文标题】让 gcc 在 c 操作之间调用特定的函数【英文标题】:Let gcc call a specific function between c operations 【发布时间】:2012-07-03 19:01:49 【问题描述】:

我正在尝试为单线程程序制作看门狗。问题是,我们运行了一些外来的 so/dll(代码可用),这意味着我们在那里传递控制权。

我们的想法是重新编译这些,并通过一些回调到某种取消例程。

是否可以让GCC在这个编译的外部代码中在C-transactions或asm-transactions之间调用一些回调函数?

【问题讨论】:

这篇 SO 帖子的答案解释了如何让 gcc 在每个函数进入和退出时注入调试调用。可能是您需要的:***.com/questions/2281739/… 朝着正确的方向前进,但是我需要更多的电话,例如在循环中 究竟什么是“C 交易”? @Stasik:我很确定你想要做的事情在 GCC 是不可能的。如果您乐于使用Clang/LLVM 并编写一个插件来添加调用,那么您可能可以做您需要的事情。但这听起来像是很多工作...... @Keith:我不知道从一个 C 语句(如“a=a+1;”)生成的一组 ASM 命令的正确解释实际上是几个 ASM 命令。 【参考方案1】:

我要建议的内容不涉及编译器,但这听起来像是一个您可以在运行时使用 POSIX 信号或ptrace 解决的问题...

您可以使用信号中断当前上下文,类似于在内核模式下使用 IRQ 会发生的情况。您将不得不担心“信号安全”(例如:您的处理程序不能使用malloc,因为它可能会在其数据结构处于不确定状态时中断malloc。)

使用ptrace,您可以像在调试器中一样单步执行另一个进程中的指令。

小心行事,因为这些机制很难正确使用,而且很容易击中自己的脚。

【讨论】:

POSIX 不是真正的替代品,因为我们使用混合的 windows/linux 环境:( @Stasik 在这种情况下,您可能需要对每种方法都采取完全不同的方法。您看过QueueUserAPC 吗? WaitForDebugEvent? 是的,ptrace 似乎是实现它的一种方式,然而,我实际上是在寻找一个单线程的解决方案。 @Stasik - 有问题的代码仍将在单个线程上运行,即使您的控制代码在另一个进程或线程中运行。在我看来,如果您赞成一些根本没有意义的事情,那么您就是在拒绝可行的解决方案。 (谁知道你最初的问题是否很好地映射到这个问题上?也许你应该退后一步,重新评估你想要做什么。) 这是真的,但是我们经常在 uC 上运行,这意味着没有看门狗线程。不过,你可能对我的丑陋做法是正确的。好的,我们假设,我采用 POSIX 信号,有没有办法强制程序粉碎堆栈并从当前函数返回它是中断处理程序中的堆栈,例如对于 ALARM 信号? (更不用说内存泄漏;))。

以上是关于让 gcc 在 c 操作之间调用特定的函数的主要内容,如果未能解决你的问题,请参考以下文章

按名称或签名计算函数调用。 GCC、C++

GCC 生成的程序集 - C 函数调用时的段错误

ARM Cortex M3上的GCC:从特定地址调用函数

如何从汇编例程中调用 C 函数并使用 nasm 和 gcc 链接 C 和汇编文件

C语言中啥叫调用函数?为啥函数和函数之间是调用关系?

复杂程序流程图怎么画调用多个函数