【问题标题】:how to override functions from stdlib如何覆盖 stdlib 中的函数
【发布时间】:2015-10-02 23:37:26
【问题描述】:

我想覆盖 strcpy 并提供我自己的实现,在我的 strcpy 中我想做一些事情并调用原始的 strcpy。 我该怎么做?

我在 linux 上工作,使用 gcc 编译,所以我阅读了 gcc 提供的内置函数,我不确定这是否是我需要的方法,但我尝试使用标志 -fno- builtin-strcpy,并在我对 __builtin_strcpy 的 strcpy 调用中,但不知何故它不能按预期工作并导致一些问题:

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

     return __builtin_strcpy(dest,src);

}

【问题讨论】:

    标签: gcc overriding strcpy built-in


    【解决方案1】:

    我想您可以通过使用链接顺序或排除一些标准库来做到这一点,但我不会这样做。如果您的 SW 寿命长且维护人员较多,则在某些时候会出现一些维护问题。

    你为什么不创建一个新的 strcpy 呢?

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

    并在需要的地方使用它。还是不符合您的要求?

    【讨论】:

    • 实际上我真正需要的是检查我的代码中发送到 strcpy 的 src 和 dest 之间的重叠位置。我想检查重叠而不是调用默认的 strcpy,以便在我的代码中找到重叠的情况。所以-“在你需要的地方使用”是我们代码中对 strcpy 的每次调用。
    • 由于您使用 gcc 在 linux 上工作,因此您应该很容易使用 valgrind (valgrind.org) 进行检查。这是一个非常有用的工具,还可能揭示其他内存处理问题。
    【解决方案2】:

    您可以使用 gcc 函数包装器来做到这一点:

    1. 在您的 strcpy 实现前加上 __wrap_(即命名为 __wrap_strcpy)。
    2. 在您的函数实现中,调用带有__real_前缀的内部库函数(即__real_strcpy)。
    3. 在链接阶段,添加开关-wrap=strcpy。这将导致每次链接器找到 strcpy 调用时,如果可用,它将调用 __wrap_strcpy。

    你的程序应该是这样的:

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

    你应该把它添加到你的 LDFLAGS 中:

    LDFLAGS+="-wrap=strcpy"

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2018-01-10
      • 1970-01-01
      • 2021-12-12
      • 2011-07-21
      • 2016-05-04
      • 2012-10-16
      • 2020-07-13
      • 1970-01-01
      相关资源
      最近更新 更多