GNU gcc / ld - zawijanie wywołania do symbolu za pomocą wywołującego i wywołującego zdefiniowanego w tym samym pliku obiektowym
aby wyjaśnić, moje pytanie odnosi się do zawijania / przechwytywania połączeń z jednej funkcji / symbolu do innej funkcji / symbolugdy rozmówca i odbiorca są zdefiniowani w tej samej jednostce kompilacji z kompilatorem i łącznikiem GCC.
Mam sytuację podobną do następującej:
/* foo.c */
void foo(void)
{
/* ... some stuff */
bar();
}
void bar(void)
{
/* ... some other stuff */
}
Chciałbym zawijać wywołania do tych funkcji i mogę to zrobić (do punktu) za pomocąld's--wrap
opcja (a następnie implementuję __wrap_foo i __wrap_bar, które z kolei wywołują __real_foo i __real_bar zgodnie z oczekiwaniami w wyniku ld's--wrap
opcja).
gcc -Wl,--wrap=foo -Wl,--wrap=bar ...
Mam problem z tym, że działa tylko w przypadku odniesień do foo i barz poza tą jednostką kompilacji (i rozwiązany w czasie połączenia). Oznacza to, że wywołania foo i bar z innych funkcjiw foo.c nie zapakuj się.
Próbowałem użyćobjcopy --redefine-sym, ale to tylko zmienia nazwy symboli i ich odniesienia.
Chciałbym zastąpić połączenia dofoo
ibar
(w foo.o) do__wrap_foo
i__wrap_bar
(tak jak są rozwiązywane w innych plikach obiektów przez linker--wrap
opcja) PRZED przekazaniem plików * .o do linkera--wrap
opcje i bez konieczności modyfikowania kodu źródłowego foo.c.
W ten sposób zawijanie / przechwytywanie odbywa się dla wszystkich połączeńfoo
ibar
, a nie tylko te, które mają miejsce poza foo.o.
czy to możliwe?