La mia risposta si basa su come funziona il linker dinamico Linux/glibc/ELF, ma vorrei assumere la risposta generale è lo stesso per le altre piattaforme:
C'è una differenza tra la prima chiamata a un carico dinamico simbolo e le prossime chiamate. La prima chiamata è costosa, può coinvolgere molti cicli. Tutte le altre chiamate sono più o meno 1 - 2 istruzioni di distanza.
Il modo in cui funziona è che il linker imposta una voce nella tabella di concatenamento della procedura che acquisisce un indirizzo per quella funzione esterna dalla tabella di offset globale. A prima chiamata l'indirizzo dei punti GOT a uno stub che esegue il linker dinamico per risolvere l'indirizzo reale della funzione nella DLL. Questo può richiedere molti cicli, ma una volta eseguito, il linker dinamico traccia la voce GOT per puntare direttamente alla funzione, quindi la prossima volta che viene chiamato il codice PLT chiamerà direttamente la funzione.
Ecco un link ad una discreta passeggiata attraverso di questo processo: http://www.technovelty.org/linux/pltgot.html
possibile duplicato di [Overhead di DLL] (http://stackoverflow.com/questions/4030043/overhead-of-dll) –