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?

questionAnswers(5)

yourAnswerToTheQuestion