new和delete运算符?这是在延续重载new和delete在非常照明C++ FAQ,操作符重载,以及其后续,一个为什么要更换默认的new和delete操作?
第1部分:编写符合标准的new运算符
第2节:编写符合标准的delete运算符
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法首先开始,所以你的答案很可能被那些提出想法的人阅读.)
注意:答案是基于Scott Meyers的学习'更有效的C++和ISO C++标准.
c++ operator-overloading c++-faq new-operator delete-operator
为了澄清,我的问题是当调用者和被调用者在与GCC编译器和链接器的同一编译单元中定义时,包装/拦截从一个函数/符号到另一个函数/符号的调用.
我的情况类似于以下情况:
/* foo.c */
void foo(void)
{
/* ... some stuff */
bar();
}
void bar(void)
{
/* ... some other stuff */
}
Run Code Online (Sandbox Code Playgroud)
我想包装对这些函数的调用,我可以用ld的--wrap选项(到某一点)用ld的选项(然后我实现__wrap_foo和__wrap_bar,然后按照ld --wrap选项的结果调用__real_foo和__real_bar ).
gcc -Wl,--wrap=foo -Wl,--wrap=bar ...
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,这只对来自此编译单元外部的foo和bar的引用生效(并在链接时解析).也就是说,从foo.c中的其他函数调用foo和bar 不会被包装.

我尝试使用objcopy --redefine-sym,但只重命名符号及其引用.
我想将调用替换为foo和bar(在foo.o中)__wrap_foo以及__wrap_bar(就像它们通过链接器--wrap选项在其他目标文件中解析一样)之前我将*.o文件传递给链接器的--wrap选项,而不必修改foo .c的源代码.
这样,包装/拦截发生在所有调用foo和bar,而不仅仅是发生在foo.o之外的调用.
这可能吗?