2016-09-04 3 views
4

In meinem Projekt muss ich einige Funktionen des glibc Quellcodes ändern. Ich muss nur einen Teil des Pthread ändern. Zum Beispiel habe ich Multithreading verwandte Funktionen wie pthread_create.c oder pthread_mutex_lock.c im Quellcode geändert. Dann, wenn mein konkretes Programm ausgeführt wird, möchte ich es angeben, um die geänderten Funktionen zu verwenden, wenn es diese Funktionen verwenden muss, und es wird andere Funktionen nicht beeinflussen. Außerdem möchte ich nicht eine ganze Version von glibc wann angeben Programm läuft. Ich muss um Ihre Hilfe bitten Gibt es eine gute Lösung für dieses Problem? Danke !! DingC/C++ Dynamic-Link-Bibliothek überladen

+5

Warum nicht einfach einen anderen Namen anstelle der Standardfunktionen verwenden? – Aganju

+0

Meinen Sie, dass Sie alle Instanzen bestimmter Glibc-Funktionen ersetzen und die Implementierungen anderer beibehalten möchten? In diesem Fall können Sie LD_PRELOAD verwenden, um Symbole aus einem SO zu laden, das die ersetzten Funktionen enthält. –

+0

Danke für Ihre Hilfe. Eigentlich muss ich einen bestimmten Parameter innerhalb der Pthread Funktion erwerben, wie id des Threads, der vom System zugewiesen wird. Also fügte ich eine Routine in die Funktion ein und kompilierte die modifizierte glibc und benutzte dann ein Instrumentierungswerkzeug, um meine Routine zu instrumentieren parameter.Wie Sie vorgeschlagen haben, möchte ich die Pthread-Funktion neu schreiben, aber ich wurde von der komplexen Beziehung Aufrufe innerhalb der glibc Quellcode gestoppt.So ich es nicht geschafft, die gesamte Glibc neu kompilieren und laden Sie die libpthread.so.Aber es kann nicht funktionieren wenn die Systemglibc-Version bei mir anders ist. Ich bin verwirrt. –

Antwort

1

Dies ist ein Job für eine gemeinsame Bibliothek Interposer. Here ist ein ausgezeichneter Artikel.

Wenn sich eine Funktion in einer gemeinsam genutzten Bibliothek befindet, kann der Runtime-Linker angewiesen werden, stattdessen eine andere "interposed" -Funktion aufzurufen. Der Interposer kann die Funktionalität vollständig ersetzen oder erweitern. Ein gutes Beispiel ist die malloc-Familie von Funktionen, ein Speicherleckdetektor und ein Heap-Berichtstool können auf einer Menge von Interposern zwischen dem Benutzerprogramm und den Systemaufrufen basieren.

Interposer funktionieren nur für gemeinsam genutzte Bibliotheken (.so). Statische (.a) Bibliotheken verbinden sich direkt mit der ausführbaren Datei und die Aufrufe können nicht einfach abgefangen werden.

Alle wichtigen Linux-Varianten unterstützen die LD_PRELOAD-Funktionalität.

Here ist ein Beispiel für Interposer für Pthread_create.

+0

Danke für Ihre Hilfe. Wirklich muss ich einen bestimmten Parameter innerhalb der Pthread Funktion erwerben, wie ID des Threads, der vom System zugewiesen wird. So fügte ich eine Routine innerhalb der Funktion ein und kompilierte das geänderte glibc, dann benutzte ein Instrumentationswerkzeug instrumentieren Sie meine Routine, um den Parameter zu erhalten. Wie Sie vorgeschlagen haben, möchte ich die Pthread-Funktion neu schreiben, aber ich wurde von den komplexen Beziehungsanrufen innerhalb des glibc-Quellcodes gestoppt. So konnte ich das ganze glibc nicht kompilieren und nur libpthread.so laden Aber es kann nicht funktionieren, wenn die System-Glibc-Version mit mir anders ist. Ich bin verwirrt. –

+0

Glibc unverändert lassen. Nimm die Implementierung von pthread_create und kopiere sie in deinen Interposer. Fügen Sie in der Interposer-Version Ihren benutzerdefinierten Code hinzu. Wenn Ihre Funktion eine andere Signatur hat, erstellen Sie einfach eine neue Funktion, z. my_pthread_create und verlinke wie gewohnt ohne den Interposer. –