如何覆盖stdlib中的函数

时间:2015-07-14 11:05:07

标签: gcc override strcpy built-in

我想覆盖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);

}

2 个答案:

答案 0 :(得分:0)

我想你可以通过玩链接顺序或排除一些标准库来做到这一点,但我不会这样做。如果你的SW有很长的使用寿命和多个维护者,那么在某些时候会出现一些维护问题。

为什么不创建新的strcpy呢?

char *my_new_strcpy(char *dest, const char *src)
{
    if(......)
    {
          ----do something---
    }

    return strcpy(dest,src);

}

并在您需要的地方使用。或者这不符合您的要求?

答案 1 :(得分:0)

您可以使用gcc函数包装器执行此操作:

  1. {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_)。
  2. 在函数实现中,使用__wrap_strcpy前缀(即__real_)调用内部库函数。
  3. 在链接阶段,添加开关__real_strcpy。这将导致链接器每次找到strcpy调用时,都会调用-wrap=strcpy代替(如果可用)。

您的程序应如下所示:

__wrap_strcpy

您应该将此添加到您的LDFLAGS:

char *__wrap_strcpy(char *dest, const char *src) { if(......) { ----do something--- } return __real_strcpy(dest,src); }

希望这会有所帮助