\chapter{Plugins} \index{plugin} % ------------------------------------ Le concept de bibliothèque partagée (\textsl{shared library} en anglais est apparu, du moins dans le monde Unix, avec \textsl{SunOS 4}, en 1989. Mais il est probable que ce concept existait déja dans d'autres mondes, peut-être avec \textsl{AmigaOS} ou \textsl{VAX/VMS}\index{VMS}\dots Et c'est en partie sur ce concept qu'est basé le premier mécanisme que nous allon découvrir~: \texttt{dlopen} et sa petite famille. % ------------------------------------ \section{Mécanique} \index{dlopen} \texttt{dlclose, dlopen, dlmopen - open and close a shared object} \begin{quote} The function dlopen() loads the dynamic shared object (shared library) file named by the null-terminated string filename and returns an opaque "handle" for the loaded object. This handle is employed with other functions in the dlopen API, such as dlsym(3), dladdr(3), dlinfo(3), and dlclose(). \end{quote} % ------------------------------------ \section{Un exemple ?} \label{ex_dlopen} Comme d'habitude, je vais proposer un exemple un peu artificiel, mais qui, de part sa simplicité, illustrera clairement les concepts de base. Partons du principe que nous avons un tableau de quatre nombres flottants, et que nous souhaitons proposer un affichage de ce tableau modifiable à volonté. Nous allons donc écrire notre fonction personnelle d'affichage dans un fichier \textsc{.c} indépendant (le plugiciel) et qui sera chargé dynamiquement au \textsl{run-time} par le logiciel principal (l'appelant). \subsection{Le plugiciel} C'est ici que nous trouverons le code actif de l'exemple, l'utilité de notre \textsl{usecase} reste à déterminer par nos lecteurs, à titre d'exercice. \lstinputlisting[language=c]{code/plugiciel.c} On peut difficelement faire plus simple pour une première approche, mais attendez la suite. \subsection{L'appelant} \lstinputlisting[language=c]{code/appelant.c} Ah, les choses se corsent un peu, il y a un pointeur bien tortueux à déchiffrer. Il était temps. \texttt{void (*funcname)(const char*, const float *);} \subsection{Le run} \begin{verbatim} tth@fubar:~/Documents/TetaTricks/code$ make plugin gcc -Wall -shared -fPIC plugiciel.c -o plugiciel.so gcc -Wall appelant.c -ldl -o appelant tth@fubar:~/Documents/TetaTricks/code$ ./appelant rgb * a = : 6.685000 8.320000 1.570795 tth@fubar:~/Documents/TetaTricks/code$ \end{verbatim} % ------------------------------------ \section{Autres langages} % -------------- to be continued