如何替换C标准库函数?

Gar*_*auh 9 c

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

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

Fat*_*ror 15

至少对于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;
}
Run Code Online (Sandbox Code Playgroud)

并像这样构建它:

gcc -fno-builtin -o strcpy strcpy.c
Run Code Online (Sandbox Code Playgroud)

然后:

$ ./strcpy 
Called my strcpy()
hello
Run Code Online (Sandbox Code Playgroud)

请注意-fno-builtin这里的重要性.如果你不使用它,GCC将取代对strcpy()内置函数的调用,其中GCC有一个数字.

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

  • 不过,这就是重点.用你自己的一个替换经过验证的库函数几乎100%保证有严重的缺陷. (3认同)
  • 我认为`strcpy()`不会*保证不会重叠字符串.但是,**保证nul-terminate dst;). (2认同)

Abh*_*ogi 6

如果你在Linux上,你可以尝试使用LD_PRELOAD.


Dav*_*son 6

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

mystuff.h:

#define strcpy my_strcpy
char * my_strcpy(char * dst, const char * src);
Run Code Online (Sandbox Code Playgroud)

my_strcpy.c:

#include <mystuff.h>
char * my_strcpy(char * dst, const char * src);
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

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. */
}
Run Code Online (Sandbox Code Playgroud)