2013-06-10 20 views
9

Sto cercando di implementare un algoritmo di gestione della memoria prima semplice. Così ho un file C con il mioPerché non ricevo un errore di collegamento quando fornisco il mio malloc gratuito?

void* malloc(size_t) 

e

void free(void*) 

Quando si genera un file .out con gcc, mi aspetto un errore di collegamento perché sarà in conflitto con lo standard esistente implementazione. Ma il mio file si collega bene.

Per favore aiutami a capire.

+0

Penso che sia considerata prassi accettabile per "sovrascrivere" le routine in questo modo utilizzando l'ordine dei collegamenti in modo che non vi sia alcun errore/avviso di collegamento per impostazione predefinita. –

+3

Collega, ma esegue effettivamente il tuo codice? GCC ha malloc e builtins gratuiti che potrebbero scavalcare i tuoi. – idoby

+4

@IBY: buon punto - OP potrebbe aver bisogno di '-fno-builtin' o' -fno-builtin-malloc -fno-builtin-free' per assicurarsi che le sue routine vengano chiamate. –

risposta

5

Mi aspetto un errore di collegamento perché sarà in conflitto con l'implementazione standard esistente.

L'aspettativa non è corretta: la maggior parte delle implementazioni di libc UNIX supporta l'utilizzo di altri malloc. A tal fine, inseriscono malloc, realloc, free ecc. In un file oggetto separato o in un file oggetto.

Il linker è quindi libero di sostituire malloc.o in libc.a con la vostra implementazione. È possibile leggere l'algoritmo utilizzato dal linker here. Una volta compreso l'algoritmo, dovrebbe essere chiaro il motivo per cui il collegamento del proprio malloc e free non causa un errore di collegamento.

Le librerie condivise UNIX sono progettate esplicitamente per emulare le librerie di archivi, quindi mentre i dettagli del perché non si ottiene un errore di collegamento quando si collega con libc.so sono diversi, lo spirito è lo stesso.

Tuttavia, non hai finito. Il collegamento di qualsiasi programma moderatamente complicato con la tua implementazione sarà probabilmente in crash, perché quando si sostituisce malloc, è necessario implementare realloc e probabilmente calloc e memalign e posix_memalign. Altrimenti, otterrai una combinazione di implementazioni e quando qualcuno passa il puntatore realloc al tuo free, le cose probabilmente esploderanno.

1

Secondo la mia esperienza, è prassi standard che i mallocs personalizzati e liberi siano denominati in modo univoco, come ad esempio kernel malloc, kmalloc e kernel free, kfree. Se stai scrivendo il tuo, ti consiglio di dare un nome separato per le tue funzioni.

Come pianificare l'allocazione della memoria? La maggior parte delle volte è necessario avvolgere la funzione malloc per fornire funzionalità personalizzate, ma continuare a utilizzare malloc in qualche modo. Secondo la mia opinione, questa è la strada da seguire, quindi non sarei troppo frettoloso per disporre delle funzioni di malloc e free a meno che non abbiate una buona ragione (o un forte desiderio) per farlo. Averli nominati uguali interferirà con questo.

This is the Minix implementation of malloc, solo per darti un'idea di cosa stai guardando.

Problemi correlati