2009-05-12 6 views
14

dove malloc() e free() memorizzano gli indirizzi allocati e le loro dimensioni (GCC Linux)? Ho letto che alcune implementazioni li memorizzano da qualche parte prima della memoria allocata, ma non ho potuto confermarlo nei miei test.Dove Store malloc()/libero() memorizza i formati e gli indirizzi?

Lo sfondo, forse qualcuno ha un altro suggerimento per questo: Sto sperimentando un po 'con l'analisi della memoria heap di un processo al fine di determinare il valore corrente di una stringa nell'altro processo. Accedere alla memoria dell'elaborazione del processo e passeggiare non è un problema. Tuttavia, poiché il valore della stringa cambia e il processo alloca una nuova parte della memoria ogni volta, l'indirizzo della stringa cambia. Poiché la stringa ha un formato fisso è ancora facile da trovare, ma dopo alcune modifiche le vecchie versioni della stringa sono ancora nella memoria heap (probabilmente liberate, ma non ancora riutilizzate/sovrascritte) e quindi non sono in grado di indica quale stringa è quella corrente.

Quindi, per trovare ancora quello corrente, voglio verificare se una stringa che trovo nella memoria è ancora utilizzata confrontando il suo indirizzo con gli indirizzi malloc/free.

Ciao, Elmar

+0

Oltre alla mia risposta di seguito, questo potrebbe aiutare un po 'http://www.linuxforums.org/forum/linux-programming-scripting/52375-reading-memory-other-processes.html –

+0

Si potrebbe anche voler scavare in giro nella parte di mappatura della memoria del kernel/glibc –

risposta

12

Ci sono molti modi in cui malloc/gratuito in grado di memorizzare le dimensioni dell'area di memoria. Ad esempio, potrebbe essere memorizzato appena prima che l'area venga restituita da malloc. Oppure potrebbe essere memorizzato in una tabella di ricerca altrove. Oppure potrebbe essere memorizzato in modo implicito: alcune aree potrebbero essere riservate per dimensioni specifiche di allocazioni.

Per scoprire come funziona la libreria C in Linux (glibc), ottenere il codice sorgente da http://ftp.gnu.org/gnu/glibc/ e osservare il file malloc/malloc.c. C'è della documentazione in alto, e si riferisce a A Memory Allocator di Doug Lea.

+1

Bello e succinto, ho avuto difficoltà a seguire la strana risposta di Aiden, non penso davvero che abbia risposto comunque. – RandomNickName42

1

Questo dipende dall'implementazione della libreria standard, ovviamente. Quindi la soluzione migliore sarebbe probabilmente scavare attraverso la fonte della libreria (glibc è l'impostazione predefinita su Linux) e vedere se riesci a capirlo. Probabilmente non sarà banale.