GNU gcc / ld - envolvendo uma chamada para símbolo com chamador e receptor definido no mesmo arquivo de objeto

para esclarecer, minha pergunta se refere a envolver / interceptar chamadas de uma função / símbolo para outra função / símboloquando o chamador e o chamado são definidos na mesma unidade de compilação com o compilador e linker do GCC.

Eu tenho uma situação parecida com a seguinte:

/* foo.c */
void foo(void)
{
  /* ... some stuff */
  bar();
}

void bar(void)
{
  /* ... some other stuff */
}

Eu gostaria de envolver chamadas para essas funções, e eu posso fazer isso (até certo ponto) comlds--wrap opção (e então eu implemento __wrap_foo e __wrap_bar que por sua vez chamam __real_foo e __real_bar como esperado pelo resultado de ld's--wrap opção).

gcc -Wl,--wrap=foo -Wl,--wrap=bar ...

O problema que estou tendo é que isso só tem efeito para referências a foo e barde fora desta unidade de compilação (e resolvido no momento do link). Ou seja, chamadas para foo e bar de outras funçõesdentro de foo.c não fique embrulhado.

Eu tentei usarobjcopy --redefine-sym, mas isso apenas renomeia os símbolos e suas referências.

Eu gostaria de substituir as chamadas parafoo ebar (dentro de foo.o) para__wrap_foo e__wrap_bar (assim como são resolvidos em outros arquivos de objetos pelo linker--wrap opção) ANTES de passar os arquivos * .o para o linker--wrap opções, e sem ter que modificar o código-fonte do foo.c.

Dessa forma, o acondicionamento / interceptação ocorre para todas as chamadas parafoo ebar, e não apenas os que ocorrem fora do foo.o.

Isso é possível?

questionAnswers(5)

yourAnswerToTheQuestion