¿Cómo reemplazar la función de biblioteca estándar de C?

¿Cómo podemos reemplazar una función de biblioteca estándar de C con nuestra propia implementación de esa función?

Por ejemplo, ¿cómo puedo reemplazar strcpy() con mi propia implementación de strcpy() y hacer que todas las llamadas se vinculen a las nuevas implementaciones?

Al menos con GCC y glibc, los símbolos para las funciones estándar de C son débiles y, por lo tanto, puede anularlos. Por ejemplo,

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; } 

Y construirlo así:

 gcc -fno-builtin -o strcpy strcpy.c 

y entonces:

 $ ./strcpy Called my strcpy() hello 

Note la importancia de -fno-builtin aquí. Si no usa esto, GCC reemplazará la llamada strcpy() a una función incorporada, de la cual GCC tiene un número.

No estoy seguro si esto funciona con otros comstackdores / plataformas.

Puedes intentar jugar con LD_PRELOAD si estás en Linux.

No estoy seguro de lo difícil que será conseguir que el enlazador haga lo que usted quiere, pero aquí hay una solución que no implica cambiar ninguna configuración del enlazador y usa macros de preprocesador en lugar de que cualquier código que intente llamar a strcpy en realidad llame a función llamada 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); { ... } 

mi_código.c:

 #include  int main() { /* Any call to strcpy will look like a normal call to strcpy but will actually call my_strcpy. */ }