Jak zmienić bibliotekę, z której ładuje się funkcja podczas pracy?Zmienianie kolejności ładowania biblioteki w czasie wykonywania (np. LD_PRELOAD, ale podczas wykonywania)
Na przykład, chcę zastąpić standardową funkcję printf
czymś nowym, mogę napisać własną wersję i skompilować ją do biblioteki współdzielonej, a następnie umieścić "LD_PRELOAD =/my/library.so" w środowisku przed uruchamianie mojego pliku wykonywalnego.
Ale powiedzmy, że zamiast tego chcę zmienić to powiązanie z poziomu samego programu. Z pewnością to musi być możliwe ... prawda?
EDIT
I nie, następujące nie działa (ale jeśli możesz mi powiedzieć jak to działało, to byłoby wystarczające).
void* mylib = dlopen("/path/to/library.so",RTLD_NOW);
printf = dlsym(mylib,"printf");
Czy możesz wyjaśnić, co masz na myśli z 'dlsym()'? Zobacz moją edycję na oryginalne pytanie, aby uzyskać więcej informacji. – tylerl
nie możesz 'printf = dlsym (mylib," printf ");' oczywiście powinieneś być w stanie, chociaż ze zmienną globalną 'int (* myprintf) (const char * fmt, ...) = dlsym (mylib, "printf") ', a następnie' #define printf myprintf' w potrzebnych jednostkach kompilacji. Myślałem, że 'printf' jest bardziej przykładem w twoim przypadku. Jeśli '' printf' jest konkretnie twoim celem (możesz także zastąpić w czasie łącza), możesz również spróbować powiedzieć linkerowi, żeby nie łączyć standardowych bibliotek, najpierw umieść bibliotekę z niestandardowym printf() na liście bibliotek - przed ręcznym określone biblioteki standardowe, w których znajduje się orig printf(). – Dummy00001
BTW, LD_PRELOAD to metoda dodawania biblioteki * przed * standardowymi bibliotekami. Po prostu robi to podczas pracy. W czasie łączenia, kolejność bibliotek, które dajesz linkerowi, określa priorytet symboli: symbole będą wyszukiwane od pierwszej lib do ostatniej. Zazwyczaj standardowe biblioteki są najpierw umieszczane na liście linków (przez interfejsy takie jak cc). Ale możesz go wyłączyć (-nostdlib) i określić ręcznie w żądanej kolejności, np. umieszczając swoją bibliotekę libmy.so przed wszystkim innym. Następnie printf() z libmy.so może * zastąpić * printf z libc. – Dummy00001