我想创建用于C代码测试的模拟函数,并了解到target_link_libraries()中的选项可以包装类似于模拟的函数,但是不知道它将如何工作?
target_link_libraries(IntegrationTests crypto-testutils mbedcrypto mbedtls sodium cmocka-static
"-Wl,\
--wrap=ExportCTRKeys,\
--wrap=malloc,\
--wrap=GenRandom)
我如何编写此包装功能以及它如何工作?
答案 0 :(得分:2)
当target_link_libraries
获得以-
开头的参数时,它将其视为链接器命令行选项,并将其原封不动地传递给链接器。因此,这与CMake无关,与ld无关。您可以在ld参考文档中进行研究,例如this one:
--wrap=
symbol
对符号使用包装函数。对符号的任何未定义引用都将解析为"__wrap_
symbol
{{1 }}。对"
"__real_
symbol
的任何未定义引用都将解析为符号。这可用于为系统功能提供包装。包装函数应称为
"
"__wrap_
symbol
。如果希望调用系统功能,则应调用"
"__real_
symbol
。这是一个简单的例子:
"
如果使用-wrap malloc 将其他代码与此文件链接,则对
void * __wrap_malloc (size_t c) { printf ("malloc called with %zu\n", c); return __real_malloc (c); }
的所有调用都将调用函数"malloc"
。在"__wrap_malloc"
中对"__real_malloc"
的调用将调用真正的"__wrap_malloc"
函数。您可能还希望提供一个
"malloc"
函数,以便没有-wrap 选项的链接将成功。如果这样做,则不应将"__real_malloc"
的定义与"__real_malloc"
放在同一文件中。如果这样做,则汇编程序可能会在链接程序有机会将其包装到"__wrap_malloc"
之前解决调用。