如何替换C标准库函数?
我们如何用我们自己的函数实现替换C标准库函数?
例如,如何将strcpy()
替换为我自己的strcpy()
实现,并将所有调用链接到新实现?
至少对于GCC和glibc,标准C函数的符号很弱 ,因此您可以覆盖它们。 例如,
strcpy.c:
#include #include 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有一个数字。
我不确定这是否适用于其他编译器/平台。
如果您使用的是Linux,可以尝试使用LD_PRELOAD 。
我不确定让链接器做你想做的事情有多难,但是这里的解决方案不涉及更改任何链接器设置而是使用预处理器宏,以便任何试图调用strcpy的代码实际上都调用了函数my_strcpy:
mystuff.h:
#define strcpy my_strcpy char * my_strcpy(char * dst, const char * src);
my_strcpy.c:
#include char * my_strcpy(char * dst, const char * src); { ... }
my_code.c:
#include int main() { /* Any call to strcpy will look like a normal call to strcpy but will actually call my_strcpy. */ }