0

我正在尝试使用 cmocka 测试模块中的私有函数。正在测试的方法还调用同一模块中的其他私有方法。

/** @file foo.c */
void foo_private();

void foo_under_test() {
    foo_private();
}

void foo_private() {
printf("REAL FOO_PRIVATE\n");
}

该模块被归档到一个库中,例如 libMyFoo.a,供 cmocka 测试使用。

测试方法的正常机制是使用测试链接器中的标志用替换方法包装子方法--wrap=foo_private,然后在单元测试中编写包装方法替换。

void __wrap_foo_private() {
printf("WRAPPED FOO_PRIVATE\n");
}

但是,由于这两种方法都在同一个模块中,这给我带来了困难。出于测试的目的,我可以更改编译、归档和链接库和测试的方式,但我无权更改被测源代码。

我试图削弱 foo_private 符号objcopy foo.o -W _foo_private foo-weak.o,当这不起作用时,我尝试使用objcopy foo.o -N _foo_private foo-removed.o.

我可以看到原始版本中的符号,

$ nm foo.o | grep foo_private
00000138 d ___gcov_.foo_private
00000048 b ___gcov0.foo_private
00001413 T _foo_private

我可以看到弱版本中的符号是周末:

$ nm foo-weak.o | grep foo_private
00000138 d __gcov_.foo_private
00000048 b __gcov0.foo_private
00001413 W _foo_private

并在已删除的版本中丢失:

$ nm foo-removed.o | grep foo_private
00000138 d ___gcov_.foo_private
00000048 b ___gcov0.foo_private

但是,无论我使用哪一个,我的测试执行总是输出。

REAL FOO_PRIVATE

在测试移除的对象时,我创建了一个本地(用于单元测试)版本的 foo_private。

objcopy 有什么我缺少的吗?符号名称错误?foo_private() 是否被静态编译成 foo_under_test()?我将优化设置为无(-O0)。

为了完整起见,我最初尝试对归档库执行此操作,效果类似,例如objcopy libMyFoo.a -N _foo_private libMyFoo-removed.a. 当这不起作用时,我进入模块级别,尝试削弱并删除那里的符号,然后将其添加回仅包含相关模块的库中。

是的,这个问题类似于下面的链接,但正如您所见,我尝试使用 objcopy 来削弱甚至删除有问题的符号,但仍在调用原始的 foo_private() 方法。

GNU gcc/ld - 使用在同一个目标文件中定义的调用者和被调用者包装对符号的调用

限制链接对象的全局符号范围

4

0 回答 0