um zu klären, meine Frage bezieht sich auf Wrapping/Abfangen von Anrufen von einer Funktion/Symbol zu einer anderen Funktion/Symbol wenn der Anrufer und die Aufgerufene sind in der gleichen Kompilierungseinheit mit dem GCC-Compiler und -Linker definiert.GNU gcc/ld - Wrapping einen Anruf auf Symbol mit Anrufer und Aufgerufenen in der gleichen Objektdatei definiert
Ich habe eine Situation ähnlich der folgenden:
/* foo.c */
void foo(void)
{
/* ... some stuff */
bar();
}
void bar(void)
{
/* ... some other stuff */
}
Ich möchte Anrufe auf diese Funktionen wickeln, und das kann ich (bis zu einem Punkt) mit ld's --wrap
option (und dann __wrap_foo und __wrap_bar ich implementieren die Rufen Sie wiederum __real_foo und __real_bar wie erwartet durch das Ergebnis von lds --wrap
Option).
gcc -Wl,--wrap=foo -Wl,--wrap=bar ...
Das Problem ist, ich habe, dass dieser Effekt dauert nur für Referenzen und von außerhalb dieser Übersetzungseinheit bar foo (und zur Verknüpfungszeit aufgelöst). Das heißt, Anrufe zu foo und bar von anderen Funktionen innerhalb foo.c nicht eingewickelt werden.
Ich versuchte objcopy --redefine-sym verwenden, aber das umbenennt nur die Symbole und ihre Referenzen.
Ich mag würde Anrufe foo
und bar
(innerhalb foo.o) zu __wrap_foo
und __wrap_bar
ersetzen (wie sie durch den --wrap
Option des Linkers in anderen Objektdateien aufgelöst werden), bevor ich die * .o-Dateien in den Pass Linker --wrap
Optionen, und ohne den Quellcode von foo.c zu ändern.
Auf diese Weise findet das Wrapping/Interception für alle Aufrufe an foo
und bar
statt, und nicht nur diejenigen, die außerhalb von foo.o stattfinden.
Ist das möglich?
Sie wahrscheinlich Ihr Problem mit Fund lösen könnten/in Ihrem Editor ersetzen oder mit sed ... –
Behaupten Sie einfach die obj mit einem Editor zu hacken? –
Ich schlage vor, dass Sie den Quellcode in Großbuchstaben ändern, um die Aufrufe der Funktion durch solche an einen Wrapper zu ersetzen, oder mit etwas, das Sie entweder als echte Funktion oder als Wrapper definieren können. –