per chiarire, la mia domanda si riferisce a avvolgere/intercettare le chiamate da una funzione/simbolo a un'altra funzione/simbolo quando il chiamante e il i callee sono definiti nella stessa unità di compilazione con il compilatore GCC e il linker.GNU gcc/ld - il wrapping di una chiamata a simbolo con chiamante e chiamato nello stesso file oggetto
Ho una situazione simile al seguente:
/* foo.c */
void foo(void)
{
/* ... some stuff */
bar();
}
void bar(void)
{
/* ... some other stuff */
}
Vorrei avvolgere le chiamate a queste funzioni, e posso farlo (a un punto) con ld's --wrap
option (e poi ho implementare __wrap_foo e __wrap_bar che a sua volta chiama __real_foo e __real_bar come previsto dal risultato dell'opzione --wrap
di ld).
gcc -Wl,--wrap=foo -Wl,--wrap=bar ...
Il problema che sto avendo è che questo ha effetto solo per i riferimenti a foo e bar da al di fuori di tale unità di compilazione (e risolti in fase di collegamento). Ovvero, le chiamate a foo e bar da altre funzioni all'interno di foo.c non vengono incapsulate.
Ho provato ad utilizzare objcopy --redefine-sym, ma che rinomina solo i simboli ed i loro riferimenti.
Vorrei sostituire le chiamate a foo
e bar
(entro foo.o) per __wrap_foo
e __wrap_bar
(proprio come si risolvono in altri file oggetto dall'opzione del linker --wrap
) prima di passare i file * .o al linker's --wrap
e senza dover modificare il codice sorgente di foo.c.
In questo modo, l'avvolgimento/intercettazione avviene per tutte le chiamate a foo
e bar
, e non solo quelle che si svolgono al di fuori di foo.o.
È possibile?
Probabilmente si potrebbe risolvere il problema con find/sostituire nel vostro editor, o utilizzando sed ... –
stai suggerendo di incidere semplicemente l'obj con un editor? –
Ti sto suggerendo di modificare il codice sorgente in blocco per sostituire le chiamate alla funzione con quelle di un wrapper o con qualcosa che puoi definire come la vera funzione o il wrapper. –