如何替换C标准库函数?

时间:2012-02-02 04:40:41

标签: c

我们如何用我们自己的函数实现替换C标准库函数?

例如,如何将strcpy()替换为我自己的strcpy()实现,并将所有调用链接到新实现?

3 个答案:

答案 0 :(得分:14)

至少对于GCC和glibc,标准C函数的符号是​​,因此您可以覆盖它们。例如,

strcpy.c:

#include <string.h>
#include <stdio.h>

char * strcpy(char *dst, const char *src)
{
  char *d = dst;
  while (*src) {
    *d = *src;
    d++;
    src++;
  }
  printf("Called my strcpy()\n");

  return (dst);
}

int main(void)
{
  char foo[10];
  strcpy(foo, "hello");

  puts(foo);

  return 0;
}

并按照以下方式构建:

gcc -fno-builtin -o strcpy strcpy.c

然后:

$ ./strcpy 
Called my strcpy()
hello

请注意-fno-builtin的重要性。如果你不使用它,GCC会将strcpy()调用替换为内置函数,其中GCC有一个数字。

我不确定这是否适用于其他编译器/平台。

答案 1 :(得分:6)

如果您使用的话,可以尝试使用LD_PRELOAD

答案 2 :(得分:5)

我不确定让链接器做你想做的事情有多难,但这里的解决方案不涉及更改任何链接器设置而是使用预处理器宏,以便任何试图调用strcpy的代码实际上调用了一个名为my_strcpy的函数:

<强> mystuff.h:

#define strcpy my_strcpy
char * my_strcpy(char * dst, const char * src);

<强> my_strcpy.c:

#include <mystuff.h>
char * my_strcpy(char * dst, const char * src);
{
    ...
}

<强> my_code.c:

#include <mystuff.h>

int main()
{
   /* Any call to strcpy will look like a normal call to strcpy
      but will actually call my_strcpy. */
}
相关问题