La maggior parte dei sistemi operativi supportano un concetto chiamato "sezioni" nel loro formato di file eseguibile (possibilmente utilizzando un nome diverso). Queste sezioni possono avere attributi diversi (come, sola lettura, lettura / scrittura, eseguibile, ecc.) E possono essere caricate in diverse parti dello spazio degli indirizzi di un'applicazione. Ad esempio, la sezione con il codice potrebbe andare nella parte inferiore dello spazio degli indirizzi, mentre i globals sono posizionati nella parte superiore (con tutto il resto disponibile tra stack e heap).
Con le librerie caricate dinamicamente, gli stessi principi possono essere usati per avere una sezione con codice che viene condiviso tra le diverse applicazioni e una sezione con variabili che vengono caricate separatamente per ogni applicazione.
Una funzionalità aggiuntiva necessaria per rendere questo lavoro è l'uso di indirizzi virtuali. Con gli indirizzi virtuali, non vi è una corrispondenza fissa tra gli indirizzi come visti da un'applicazione e le celle della memoria fisica. Ciò consente al sistema operativo di scambiare le pagine di memoria dentro e fuori la RAM, ma fornisce anche i mezzi per condividere pagine di memoria fisica tra processi (anche se non corrispondono a indirizzi virtuali identici in quei processi) e di avere identiche gli indirizzi virtuali in due processi si riferiscono a diversi luoghi fisici.
Quindi, la maggior parte del lavoro svolto per far funzionare le librerie caricate dinamicamente è fatto dal sistema operativo. Il compilatore e il linker devono semplicemente mettere tutto nelle sezioni appropriate, in modo che le cose non modificabili possano essere condivise tra i processi, mentre le variabili vengono allocate separatamente per ogni processo.