2015-05-10 20 views
7

È possibile modificare dinamicamente la tabella dei simboli in fase di esecuzione in C (in formato elf su Linux)?Tabella dei simboli di modifica dinamica in fase di esecuzione (in C)

Il mio obiettivo finale è la seguente:

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.

Nota: questo è diverso da LD_PRELOAD che sostituisce malloc durante l'intera esecuzione del programma.

risposta

6

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.

+0

> 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

Problemi correlati