c - 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)
我如何编写这个包装功能以及它是如何工作的?
解决方案
当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"
.
推荐阅读
- sql - MERGE 与多个 UPDATE 语句
- bash - 是否有批量更改文件时区的命令?
- vb6 - 带滚动条的老兄
- c# - EHLLAPI IBM communicator c# Web Api 不能在 IIS 上工作
- javascript - React 中的 onTouchStart 与 onClick?
- c# - C# TFS 以编程方式设置文件的最新信息?
- python - 在python pdfkit中将html转换为pdf时如何设置页面大小
- python - 如何读取这两列并将其存储在关键字字典中
- java - 如何将方法名称设置为新类中的参数?
- python - 即使向量相反,Keras Dot 也会给出正余弦相似度