我们如何用我们自己的函数实现替换C标准库函数?
例如,如何将strcpy()
替换为我自己的strcpy()
实现,并将所有调用链接到新实现?
答案 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. */
}