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 № 1malloc 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