Wie ändere ich die Bibliothek, aus der eine Funktion während der Laufzeit geladen wird?Ändern der Bibliotheksladefolge zur Laufzeit (wie LD_PRELOAD, aber während der Ausführung)
Zum Beispiel möchte ich die Standardfunktion printf
durch etwas Neues ersetzen, ich kann meine eigene Version schreiben und es in eine gemeinsame Bibliothek kompilieren, dann legte "LD_PRELOAD =/my/library.so" in die Umgebung vor läuft meine ausführbare Datei.
Aber lassen Sie uns stattdessen sagen, dass ich diese Verknüpfung innerhalb des Programms selbst ändern möchte. Das muss doch möglich sein ... oder?
EDIT
Und nein, wird die folgende nicht (aber wenn Sie mir sagen, wie es funktioniert, das wäre dann ausreichend sein).
void* mylib = dlopen("/path/to/library.so",RTLD_NOW);
printf = dlsym(mylib,"printf");
Können Sie erklären, was Sie mit 'dlsym()' meinen? Weitere Informationen finden Sie unter Bearbeiten der ursprünglichen Frage. – tylerl
Sie können nicht 'printf = dlsym (mylib," printf ");' offensichtlich sollten Sie jedoch mit einer globalen Variable 'int (* myprintf) (const char * fmt, ...) = dlsym (mylib, "printf") '' und dann '#define printf myprintf' in den benötigten Übersetzungseinheiten. Ich habe gedacht, dass 'printf' in Ihrem Fall eher ein Beispiel wäre. Wenn "printf" speziell Ihr Ziel ist (und eine Überschreibung zur Verbindungszeit ist auch eine Option), können Sie Linker auch dazu bringen, keine Standardbibliotheken zu verknüpfen, sondern Ihre Bibliothek mit printf() zuerst in der Bibliotheksliste - manuell - zu platzieren spezifizierte Standardbibliotheken, in denen sich orig printf() befindet. – Dummy00001
BTW, LD_PRELOAD ist eine Möglichkeit, eine Bibliothek * vor * Standardbibliotheken hinzuzufügen. Es tut es nur während der Laufzeit. Während der Verbindungszeit ist die Reihenfolge der Bibliotheken, die Sie dem Linker geben, die Priorität der Symbole: Symbole werden von der ersten bis zur letzten Bibliothek gesucht. Normalerweise werden Standardbibliotheken zuerst in die Linkliste aufgenommen (durch Frontends wie cc). Sie können sie jedoch deaktivieren (-nostdlib) und sie manuell in der von Ihnen benötigten Reihenfolge angeben, z. indem Sie Ihre libmy.so zuerst vor allem anderen setzen. Dann würde printf() von libmy.so * printf von libc * überschreiben. – Dummy00001