La interposición de funciones es el concepto de reemplazar llamadas a funciones en bibliotecas dinámicas con llamadas a contenedores definidos por el usuario.

¿Qué son las aplicaciones?

  1. Podemos contar el número de llamadas para funcionar.
  2. Almacene la información de la persona que llama y los argumentos pasados ​​a la función para rastrear el uso.
  3. Detectamos una fuga de memoria, podemos anular malloc () y realizar un seguimiento de los espacios asignados.
  4. Podemos agregar nuestras propias políticas de seguridad. Por ejemplo, podemos agregar una política en la que no se puede llamar a la bifurcación con más de la profundidad de recursión especificada.

¿Cómo se hace la interposición de funciones?
La tarea es escribir nuestro propio malloc () y asegurarse de que nuestro propio malloc () se llame en lugar de la biblioteca malloc (). A continuación se muestra un programa controlador para probar diferentes tipos de interposiciones de malloc ().

 

#include <stdio.h>

#include <stdlib.h>

#include <malloc.h>

 

int main(void)

{

    

    void *ptr = malloc(4);

     

    printf("Hello World
"
);

    return 0;

}

  1. Tiempo de compilación : Reemplaza la llamada a la biblioteca con nuestra propia función cuando se compila el código fuente.

       

     

    #include <stdio.h>

    #include <malloc.h>

    void *mymalloc(size_t s)

    {

       printf("My malloc called");

       return NULL;

    }

    #define malloc(size) mymalloc(size)

    void *mymalloc(size_t size);

    Pasos para ejecutar arriba en Linux:

    // Compile the file containing user defined malloc()
    :~$ gcc  -c mymalloc.c
    
    // Compile hello.c with output file name as helloc. 
    // -I. is used to include current folder (.) for header
    // files to make sure our malloc.h is becomes available.
    :~$ gcc  -I. -o helloc hello.c mymalloc.o
    
    // Run the generated executable
    :~$ ./helloc
    My malloc called
    Hello World 
  2. .

  3. Tiempo de enlace: Cuando los archivos de objeto reubicables están vinculados estáticamente para formar un archivo de objeto ejecutable.

       

    #include <stdio.h>

     

    void *__real_malloc(size_t size);

     

    void *__wrap_malloc(size_t size)

    {

       printf("My malloc called");

       return NULL;

    }

    Pasos para ejecutar arriba en Linux:

    // Compile the file containing user defined malloc()
    :~$ gcc  -c mymalloc.c
    
    // Compile hello.c with output name as hellol  
    // "-Wl,--wrap=malloc" is used tell the linker to use
    //  malloc() to call __wrap_malloc(). And to use 
    // __real_malloc() to actual library malloc() 
    :~$ gcc  -Wl,--wrap=malloc -o hellol hello.c mymalloc.o
    
    // Run the generated executable
    :~$ ./hellol
    My malloc called
    Hello World 
  4. .

  5. Tiempo de carga / ejecución: Cuando un archivo de objeto ejecutable se carga en la memoria, se vincula dinámicamente y luego se ejecuta.

    La variable de entorno LD_PRELOAD le da al cargador una lista de bibliotecas para cargar antes de un comando o ejecutable.
    Creamos una biblioteca dinámica y nos aseguramos de que esté cargada antes de nuestro ejecutable para hello.c.

       

    #define _GNU_SOURCE

    #include <stdio.h>

     

    void *malloc(size_t s)

    {

       printf("My malloc called
    "
    );

       return NULL;

    }

    Pasos para ejecutar arriba en Linux:

    // Compile hello.c with output name as helloc
    :~$ gcc -o hellor hello.c
    
    // Generate a shared library myalloc.so. Refer
    // https://tutorialspoint.dev/slugresolver/working-with-shared-libraries-set-2/
    // for details.
    :~$ gcc -shared -fPIC -o mymalloc.so mymalloc.c
    
    // Make sure shared library is loaded and run before .
    :~$ LD_PRELOAD=./mymalloc.so ./hellor
    My malloc called
    Hello World
    
  6. .

    El código para malloc definido por el usuario se mantiene pequeño para una mejor legibilidad. Idealmente, debería asignar memoria haciendo una llamada a la biblioteca malloc ().

    Fuente:
    https://www.utdallas.edu/~zxl111930/spring2012/public/lec18-handout.pdf

    Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema discutido anteriormente.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *