c - 为所有函数设置 GCC 默认属性(使所有函数符号对于猴子补丁来说都是弱的)

标签 c gcc monkeypatching weak-linking

我目前正在编写一个 C 项目,其中包含一个单独的测试版本。

这些测试是不同的 C 进程,它们使用源代码来测试我的代码中每个定义的函数 (TDD)。

我希望在这些测试中进行猴子修补。我花了一些时间看看它可以做什么,我认为最简单的选择是使用 gcc 属性功能:https://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Function-Attributes.html

对于测试构建,我希望所有函数都是弱的(IE,我想要与在任何函数前面编写 __attribute__ ((weak)) 相同的效果我的 C 文件的声明。)

我想知道是否有一种方法可以默认将这个弱属性作为编译选项传递,而不是每次需要时手动执行。 现在我正在使用一个宏来测试构建是否正在测试中,如果是,则在我想要的每个函数之前添加此行。我宁愿避免仅仅为了允许一些测试功能而复杂化源代码。

谷歌上的这个主题因重复相同的琐碎属性使用而受到污染,但我找不到任何设置属性默认值的方法。

不过,我找到了这本书https://link.springer.com/chapter/10.1007%2F978-1-4302-0704-7_4这可能包含解决方案,但我不会仅仅为了希望而支付 30 美元。所以我在这里问这个问题。

有些人可能认为这是一个坏主意,但在我的情况下,我认为这很好。请记住,我的测试套件由许多链接到我的代码的单 C 文件组成,并请记住,正常构建不会受到新测试构建选项的影响。

最佳答案

关注怎么样?

  1. 您制作单独的文件(我们称之为weak.h),其中所有符号都需要以以下形式转换为weak

#pragmaweak func1

#pragmaweak func2

#pragmaweak func3

...

  • 在测试编译期间,您添加默认包含以下内容 this
  • gcc -includeweak.h ...

    我自己从未尝试过这种方法,但这样做你的代码不会受到影响,这似乎是你最想要的

    附注

    刚刚尝试了一下,几个符号源文件似乎可以在 Ubuntu 18.04 x64 上运行

    关于c - 为所有函数设置 GCC 默认属性(使所有函数符号对于猴子补丁来说都是弱的),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61065671/

    相关文章:

    python - Pytest:模拟/猴子修补 python 中的内置 input() 和 print() 函数

    c - 使用函数的参数初始化静态变量

    c - Windows 线程池

    c - makefile错误缺少分隔符错误

    python - "Replacing"具体函数调用

    ruby - Un-monkey 修补 Ruby 中的类/方法

    c - 堆内存分配

    c - 每个线程的免费 TLS 指针

    c - 双百分号 (%%) 在 gcc 内联汇编中有什么作用?

    c - 为什么这段代码可以在 gcc 6.3.0 上运行,而不能在 4.9.2 上运行?