gpt4 book ai didi

c - target_link_libraries(--wrap) 是如何工作的?

转载 作者:太空宇宙 更新时间:2023-11-04 07:44:57 28 4
gpt4 key购买 nike

我想为 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 引用文档中研究这一点,例如 this one :

--wrap=symbol
Use a wrapper function for symbol. Any undefined reference to symbol will be resolved to "__wrap_symbol". Any undefined reference to "__real_symbol" will be resolved to symbol.

This can be used to provide a wrapper for a system function. The wrapper function should be called "__wrap_symbol". If it wishes to call the system function, it should call "__real_symbol".

Here is a trivial example:

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

If you link other code with this file using --wrap malloc, then all calls to "malloc" will call the function "__wrap_malloc" instead. The call to "__real_malloc" in "__wrap_malloc" will call the real "malloc" function.

You may wish to provide a "__real_malloc" function as well, so that links without the --wrap option will succeed. If you do this, you should not put the definition of "__real_malloc" in the same file as "__wrap_malloc"; if you do, the assembler may resolve the call before the linker has a chance to wrap it to "malloc".

关于c - target_link_libraries(--wrap) 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57870802/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com