如何才能不影响原函数,但是又包含原函数?
我想定义一个函数,这个函数和已有的函数同名字,编译无法通过。但是呢,我想在不更换这个函数名字的前提下,让调用原函数的地方,直接调用我的函数,
然后在我的函数中再去调用原函数。
是不是有些绕?
好,举个例子。
原函数名字叫_txe_block_allocate,我新建个函数也叫这个名字,然后我在当前我新建的函数中
调用了一个_txe_block_allocate_orig,然后在我的内部.c文件中定义 extern UINT _txe_block_allocate_orig;
在外面的.h文件中让#pragma weak _txe_block_allocate_orig=_txe_block_allocate
感觉有些混乱,但是我是这么理解的。因为这就是trace alyzer源码这么干的,现在编译不过了,哪位大神给解决一下:'(
我把源码传上来。
你直接屏蔽原来的函数实现重新实现不行吗?还是有什么新的需求 你用宏定义也ok吧#pragma weak _txe_block_allocate_orig=_txe_block_allocate 好像不太行? 我记得是在函数前加static, 就只有同文件的函数能调用它,而且不同文件可以有同各的函数,你试试吧
如果说不行,就用宏把文件名称连接到函数名, 这看起来就等于同名的函数。 手动修改链接文件即可。 #pragma weak symbol1 = symbol2
This pragma declares symbol1 to be a weak alias of symbol2. It is an error if symbol2 is not defined in the current translation unit.
好问题,用"#pragma weak symbol1 = symbol2"应该是可以满足你的需求,它允许你灵活控制链接不同的函数。 可以把原函数用 weak 定义成弱函数 老生常谈的问题,参考:
https://www.armbbs.cn/forum.php?mod=viewthread&tid=123362&extra= 本帖最后由 glory 于 2024-4-1 11:05 编辑
总结起来就是,keil用$Super$$ 和 $Sub$$,
extern void ExtraFunc(void);
extern void $Super$$foo(void);
/* this function is called instead of the original foo() */
void $Sub$$foo(void){
ExtraFunc(); /* does some extra setup work */
$Super$$foo();/* calls the original foo() function */
/* To avoid calling the original foo() function
* omit the $Super$$foo(); function call. */
}
gcc 用__wrap 和 __real(并且用--wrap选项指定symbol),
void* __wrap_malloc(size_t size)
{
fprintf(stdout, "call __wrap_malloc function, size: %d\n", size);
return __real_malloc(size);
}
glory 发表于 2024-4-1 11:03
总结起来就是,keil用$Super$$ 和 $Sub$$,
extern void ExtraFunc(void);
extern v ...
大神,iar呢?我看iar里对gcc的支持,没有wrap的支持:'( zhang0352505 发表于 2024-4-1 11:39
大神,iar呢?我看iar里对gcc的支持,没有wrap的支持
IAR目前没有这个功能 glory 发表于 2024-4-5 12:30
IAR目前没有这个功能
好吧,多谢
页:
[1]