Un des grands préceptes de la programmation est la re-utilisation de code existant. Nombreuses fonctionnalitées sont nécessitées par de nombreux programmes différents. Une possibilité pour réduire les coûts de développement (c'est à dire le temps de développement et la déprime du fait de reinvneter chaque fois la roue) est l'utilisation de librairies. Sont regroupées les fonctions utiles par thèmes dans des librairies, on différencie les libraires statiques des libraires dynamiques.
Le premier type de libraire à être apparu était la libraire statique, reconnaissable à leur suffixe '.a'. Tout programme ayant besoin de certaines fonctionnalitées inclut les librairies concernées, incluant par la même occasion tout le code de ces libraires. L'avantage étant que ce programme une fois compilé et 'linké' (regroupé avec les libraires) n'aura plus aucune dépendance externe, et pourra donc ètre facilement migré vers d'autres machines, ou servir comme utilitaire de base dans des disquettes de récupération de système.
Le désavantage de ce sytème est la taille des exécutables et le fait que si l'on lance des instances de programmes qui utilisent toutes la même libraire, on aura en mémoire autant de copies de cette libraire, ce qui représente encore aujourd'hui du gâchis (vu que la mémoire est et reste chére).
D'où l'idée de faire le 'linkage' au dernier moment, à l'exécution du programme, en gardant les parties communes chargées exactement une fois. C'est ce qu'on appelle des librairies dynamiques, reconnaisables à leur suffixe '.so'.