我想覆盖strcpy并提供我自己的实现,在我的strcpy中我想做一些事情并调用原来的strcpy。 我怎么能这样做?
我正在研究linux,使用gcc进行编译,所以我读到了gcc提供的内置函数,我不确定这是否是我需要的方法,但我尝试使用标志-fno- builtin-strcpy,并在我的strcpy调用__builtin_strcpy,但不知何故它不能按预期工作,并导致一些问题:
char *strcpy(char *dest, const char *src)
{
if(......)
{
----do something---
}
return __builtin_strcpy(dest,src);
}
答案 0 :(得分:0)
我想你可以通过玩链接顺序或排除一些标准库来做到这一点,但我不会这样做。如果你的SW有很长的使用寿命和多个维护者,那么在某些时候会出现一些维护问题。
为什么不创建新的strcpy呢?
char *my_new_strcpy(char *dest, const char *src)
{
if(......)
{
----do something---
}
return strcpy(dest,src);
}
并在您需要的地方使用。或者这不符合您的要求?
答案 1 :(得分:0)
您可以使用gcc函数包装器执行此操作:
{message: "Trying to get property 'stdId' of non-object", exception: "ErrorException",…}
exception: "ErrorException"
file: "C:\laravel\school\app\Http\Controllers\RollCallController.php"
line: 20
messag
前面加上strcpy
(即,将其命名为__wrap_
)。__wrap_strcpy
前缀(即__real_
)调用内部库函数。__real_strcpy
。这将导致链接器每次找到strcpy调用时,都会调用-wrap=strcpy
代替(如果可用)。您的程序应如下所示:
__wrap_strcpy
您应该将此添加到您的LDFLAGS:
char *__wrap_strcpy(char *dest, const char *src)
{
if(......) {
----do something---
}
return __real_strcpy(dest,src);
}
希望这会有所帮助