E 'possibile modificare dinamicamente la tabella dei simboli in fase di esecuzione in C (in formato elf su Linux)?
In teoria questo è possibile, ma in pratica è troppo difficile da fare.
All'interno certa funzione dicono foo
, voglio ignorare malloc
funzione per il mio gestore personalizzato my_malloc
. Ma al di fuori di foo
, qualsiasi malloc
dovrebbe comunque chiamare a malloc
come in glibc.
Modifica tabella dei simboli (anche se fosse possibile) sarebbe non si raggiungere il vostro obiettivo desiderato.
Tutti le chiamate da qualsiasi punto all'interno del binario ELF (supponiamo foo
è nel file eseguibile principale), risolvono allo stesso PLT slot di importazione [email protected]
. Lo slot è risolto con glibc malloc
alla prima chiamata (da qualsiasi punto del programma, supponendo che non si stia utilizzando LD_BIND_NOW=1
o simile). Dopo che lo slot è stato risolto, qualsiasi ulteriore modifica alla tabella dei simboli avrà senza effetto.
Non hai detto quanto controllo su foo
hai.
Se è possibile ricompilare, il problema diventa banale:
#define malloc my_malloc
int foo() {
// same code as before
}
#undef malloc
Se si è consegnato un precompilato foo.o
, si collega con my_malloc.o
, e si desidera reindirizzare tutte le chiamate dall'interno foo.o
da malloc
a my_malloc
, che è in realtà abbastanza semplice da fare a livello di oggetto (cioè prima del collegamento finale).
Tutto quello che dovete fare è passare attraverso foo.o
record di trasferimento, e modificare quelli che dicono "mettere l'indirizzo di esterni malloc
qui" a "mettere l'indirizzo di esterni my_malloc
qui".
Se foo.o
contiene funzioni aggiuntive oltre a foo
, è piuttosto semplice limitare la riscrittura del riposizionamento solo alle riposizionazioni all'interno di foo
.
> cambia quelli che dicono "metti indirizzo di malloc esterno qui" a "metti indirizzo di my_malloc esterno qui". Qualsiasi strumento, ad esempio gcc, può farlo? – Richard