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?