首页 > 解决方案 > target_link_libraries(--wrap) 是如何工作的?

问题描述

我想为 C 代码测试创建模拟函数并了解在 target_link_libraries() 中可以选择包装类似于模拟的函数,但不明白它是如何工作的?

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

我如何编写这个包装功能以及它是如何工作的?

标签: ccmakecmocka

解决方案


target_link_libraries获取以 开头的参数时-,它将它们视为链接器命令行选项并将它们原封不动地传递给链接器。因此,这与 CMake 无关,而与 ld 无关。您可以在 ld 参考文档中研究这一点,例如这个

--wrap=symbol
对符号 使用包装函数。任何未定义的符号引用都将被解析为. 任何未定义的引用都将被解析为符号。"__wrap_symbol""__real_symbol"

这可用于为系统函数提供包装器。应该调用包装函数。如果它想调用系统函数,它应该调用."__wrap_symbol""__real_symbol"

这是一个简单的例子:

void *
__wrap_malloc (size_t c)
{
  printf ("malloc called with %zu\n", c);
  return __real_malloc (c);
}

如果您使用--wrap malloc将其他代码与此文件链接,则所有调用都"malloc"将改为调用该函数"__wrap_malloc"。对"__real_malloc"in的调用"__wrap_malloc"将调用真正的"malloc"函数。

您可能还希望提供一个"__real_malloc"函数,以便没有--wrap选项的链接会成功。如果这样做,则不应将 的定义与;"__real_malloc"放在同一文件中"__wrap_malloc"。如果你这样做了,汇编器可能会在链接器有机会将其包装到"malloc".


推荐阅读