Рубрики

Вложение функции в C с примером пользовательского malloc ()

Интерпозиция функций — это концепция замены вызовов функций в динамических библиотеках вызовами пользовательских оболочек.

Какие приложения?

  1. Мы можем посчитать количество вызовов, чтобы функционировать.
  2. Сохраните информацию о вызывающем абоненте и аргументы, переданные функции для отслеживания использования.
  3. Обнаружив утечку памяти, мы можем переопределить malloc () и отслеживать выделенные места.
  4. Мы можем добавить наши собственные политики безопасности. Например, мы можем добавить политику, что fork не может быть вызван с более чем указанной глубиной рекурсии.

Как сделать функцию вставки?
Задача состоит в том, чтобы написать свой собственный malloc () и убедиться, что наш собственный malloc () вызывается вместо библиотеки malloc (). Ниже приведена программа драйвера для тестирования различных типов взаиморасположений malloc ().

// Имя файла: hello.c

  
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

  

int main(void)

{

    // Вызов определенного пользователем malloc

    void *ptr = malloc(4);

      

    printf("Hello World\n");

    return 0;

}

  1. Время компиляции: замените вызов библиотеки нашей собственной функцией при компиляции исходного кода.

    / * Композиция malloc во время компиляции с использованием препроцессора C.

       Локальный файл malloc.h определяет malloc как оболочку * /

      
    // Файл, который содержит нашу собственную функцию malloc
    // Имя файла: mymalloc.c
    #include <stdio.h>
    #include <malloc.h>

    void *mymalloc(size_t s)

    {

       printf("My malloc called");

       return NULL;

    }

    // имя файла: malloc.h
    // Заменить все вызовы malloc на mymalloc
    #define malloc(size) mymalloc(size)

    void *mymalloc(size_t size);

    Шаги для выполнения выше в 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. Время соединения: когда перемещаемые объектные файлы статически связаны, чтобы сформировать исполняемый объектный файл.

    // имя файла: mymalloc.c
    / * Взаимное расположение malloc с использованием

       Флаг статического компоновщика (ld) «--wrap symbol». * /

    #include <stdio.h>

      
    // __real_malloc () используется для вызова фактической библиотеки
    // malloc ()

    void *__real_malloc(size_t size);

      
    // Пользовательская оболочка для malloc ()

    void *__wrap_malloc(size_t size)

    {

       printf("My malloc called");

       return NULL;

    }

    Шаги для выполнения выше в 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. Время загрузки / выполнения: когда исполняемый объектный файл загружается в память, динамически связывается и затем выполняется.

    Переменная окружения LD_PRELOAD дает загрузчику список загружаемых библиотек перед командой или исполняемым файлом.
    Мы создаем динамическую библиотеку и проверяем, загружена ли она перед нашим исполняемым файлом hello.c.

    / * Оперативная вставка malloc на основе динамического компоновщика

       (ld-linux.so) LD_PRELOAD механизм * /

    #define _GNU_SOURCE
    #include <stdio.h>

      

    void *malloc(size_t s)

    {

       printf("My malloc called\n");

       return NULL;

    }

    Шаги для выполнения выше в Linux:

    
    // Compile hello.c with output name as helloc
    :~$ gcc -o hellor hello.c
    
    // Generate a shared library myalloc.so. Refer
    // https://www.geeksforgeeks.org/working-with-shared-libraries-set-2/amp/
    // 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. ,

    Код для определяемого пользователем malloc хранится небольшим для лучшей читаемости. В идеале он должен распределять память, вызывая библиотеку malloc ().

    Источник:
    https://www.utdallas.edu/~zxl111930/spring2012/public/lec18-handout.pdf

    Эта статья предоставлена Адитьей Чаттерджи . Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью и отправить ее по почте на contrib@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

    Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

    Рекомендуемые посты:

    Вложение функции в C с примером пользовательского malloc ()

    0.00 (0%) 0 votes