/ / Jak dodać własny zdefiniowany malloc do Linuksa - c ++, linux, system operacyjny, malloc

Jak dodać własny zdefiniowany malloc do Linuksa - c ++, linux, system operacyjny, malloc

Chcę dodać własną funkcję malloc (np. "self_malloc ()") i funkcję wyboru (np."selec_malloc ()") do systemu operacyjnego Linux.

Za każdym razem, gdy proces wymaga wywołania funkcji malloc w celu przydzielenia pamięci, system operacyjny to zrobi wywołaj selec_malloc (), aby zdecydować się na wywołanie oryginalnego malloc lub self_malloc ()

To znaczy, chcę dodaj funkcję wyboru przed wywołaniem malloc. Czy jest jakiś sposób, aby to osiągnąć i co muszę zrobić?

Mając nadzieję na twoją pomoc.

Odpowiedzi:

1 dla odpowiedzi № 1

malloc nie jest częścią Linuksa, ale jest częścią libc. Możesz dostarczyć własną wersję libc z inną implementacją malloc. W takim przypadku możesz przełączać się między różnymi wersjami malloc, przełączając ścieżkę wyszukiwania biblioteki.

Inną opcją jest użycie LD_PRELOAD. To wstępnie ładuje wspólną bibliotekę podczas uruchamiania programu. Dzięki temu można przeciążać funkcje z udostępnionych bibliotek z wersjami we wstępnie załadowanej bibliotece. Możesz nawet wywołać oryginalną wersję z poziomu twojego kodu używając dlsym i RTLD_NEXT w ten sposób:

typedef void *(*malloc_ptr)(size_t size);

void *malloc(size_t size) {
malloc_ptr _malloc;
_malloc=(malloc_ptr)dlsym(RTLD_NEXT,"malloc"); // look up original malloc()
return malloc_(size);                          // and invoke it
}

Wybór, która wersja malloc jest używana, zależy od istnienia LD_PRELOAD. Jeśli zostanie ustawiony, użyty zostanie wstępnie załadowany malloc, jeśli nie zostanie ustawiony, użyje się wersji standardowej.

Wywoływanie programu wygląda następująco:

LD_PRELOAD=libmymalloc.so ./a.out