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.
> ä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