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有一个数字.
我不确定这是否适用于其他编译器/平台.
我不确定让链接器做你想做的事情有多难,但是这里的解决方案不涉及更改任何链接器设置而是使用预处理器宏,以便任何试图调用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)