target_link_libraries(-wrap)如何工作?

时间:2019-09-10 12:27:32

标签: c cmake cmocka

我想创建用于C代码测试的模拟函数,并了解到target_link_libraries()中的选项可以包装类似于模拟的函数,但是不知道它将如何工作?

target_link_libraries(IntegrationTests crypto-testutils mbedcrypto mbedtls sodium cmocka-static
"-Wl,\
--wrap=ExportCTRKeys,\
--wrap=malloc,\
--wrap=GenRandom)

我如何编写此包装功能以及它如何工作?

1 个答案:

答案 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"之前解决调用。