2015-05-10 22 views
7

Ist es möglich, die Symboltabelle zur Laufzeit in C dynamisch zu ändern (im Elf-Format unter Linux)?Dynamische Modifikation der Symboltabelle zur Laufzeit (in C)

Mein Endziel ist die folgende:

Innen bestimmte Funktion sagen foo, ich malloc Funktion meiner benutzerdefinierten Handler my_malloc außer Kraft setzen möchten. Aber außerhalb foo, sollte jeder malloc noch zu malloc wie in glibc aufrufen.

Hinweis: Dies unterscheidet sich von LD_PRELOAD, die während der gesamten Programmausführung malloc überschreiben würde.

Antwort

6

Ist es möglich, die Symboltabelle zur Laufzeit dynamisch in C zu ändern (im Elf-Format unter Linux)?

In der Theorie ist dies möglich, aber in der Praxis ist es zu schwer zu tun.

Innen bestimmte Funktion sagen foo, ich malloc Funktion meiner benutzerdefinierten Handler my_malloc außer Kraft setzen möchten. Aber außerhalb foo, sollte jeder malloc noch zu malloc wie in glibc aufrufen.

Ändern Symboltabelle (auch wenn es möglich wäre) würde nicht erhalten Sie zu Ihrem gewünschten Ziel.

Alle Anrufe von überall in Ihrem ELF-Binaries (nehmen wir an, foo in der Haupt ausführbar ist), lösen, um die gleichen PLT Import Slot [email protected]. Dieser Slot wird beim ersten Aufruf in Glibc malloc aufgelöst (von überall in Ihrem Programm, vorausgesetzt, Sie verwenden nicht LD_BIND_NOW=1 oder ähnliches). Nachdem dieser Slot aufgelöst wurde, hat jede weitere Änderung der Symboltabelle keinen Effekt.

Sie haben nicht gesagt, wie viel Kontrolle über foo Sie haben.

Wenn Sie es neu kompilieren können, wird das Problem trivial:

#define malloc my_malloc 
int foo() { 
    // same code as before 
} 
#undef malloc 

Wenn Sie eine vorkompilierte foo.o geben werden, verknüpfen Sie es mit my_malloc.o, und Sie möchten alle Anrufe umleiten von innen foo.o von malloc zu my_malloc, das ist eigentlich ziemlich einfach auf der Objektebene (dh vor der letzten Verbindung) zu tun.

Alles, was Sie tun müssen, ist gehen durch foo.o Verlagerung Aufzeichnungen, und die, die ändern, die „externe malloc Adresse hier setzen“ sagen „hier-Adresse des externen my_malloc setzen“.

Wenn foo.o zusätzliche Funktionen neben foo enthält, ist es relativ einfach, das Umsetzen der Verschiebung auf die Umsetzungen innerhalb von foo zu beschränken.

+0

> ändern Sie die, die sagen "put Adresse von externen malloc hier", um "Adresse von externen my_malloc hier zu setzen". Jedes Werkzeug, sagen GCC, das kann das tun? – Richard