website logo
Auteur
avatar
thellier

Forum » » Création-Développement » » Y-a-t'il possibilité de faire une library système en C sur Os4


Posté : 18-11-2014 11:59 icone du post

>Je vois qu'un certain Alain a donné le source d'une lib ici : Simple library for sound/picture datatype


Effectivement créer une toto.library revient à


1) créer une liste propre de ses fonctions comme dans une "static library" faire tout particuliérement attention à éviter les variables globales (sauf les vraies bien sûr)


2) Y ajouter un "header" de .library : c'est incompréhensible parfois ça contient de l'asm il vaut mieux y toucher un minimum
Je suis parti de celui là
http://aminet.net/package/dev/c /CLib-SDI
Mais on peut utiliser un des miens comme celui de SimpleDT ou Wazp3D


3) Dans ce "header" standard juste quatre parties seront à adapter pour notre .library


a) nom,version,sous version, date = juste des #define à modifier


b) les fonctions de démarrage/fermeture de la .library


cad
libInit & libOpen
libClose & libExpunge
Là aussi il vaut mieux ne pas toucher au "header" et juste y appeler ses propres
LIB_Init(exec); LIB_Close(); LIB_Open(); LIB_Expunge(); définis dans un autre fichier


LIB_Init initialise pour la première fois la .library donc c'est là qu'on ouvre les autres .library dont on va se servir, alloue la mémoire,les structure et met les valeurs par défauts
LIB_Expunge c'est quand la .library est enlevée quand elle sert plus donc c'est là qu'on ferme les .library dont se servira plus,etc..


LIB_Open(); LIB_Close(); correspond à la simple ouverture/fermeture de la .library par un programme : elle est déjà en mémoire donc à priori rien à faire
Note: Effectivement avec une .library plusieurs progs ouvrent/ferment/utilisent votre .library le premier à s'en servir déclenche un LIB_Init, le dernier à la fermer provoque un LIB_Expunge


c) La jump table
C'est un tableau contenant l'adresse des fonctions à appeller car on appelle les fonctions dans une .library par leur offset
C'est un peu comme si on disait appelle moi la 3éme fonction donc il faut un tableau pour faire cela fonction=jumptable[3];


d) les glue functions
Sur Amiga OS3 les fonction sont appellées en assembleur avec les parametres dans les registres
Mais nous avons écrits des fonctions C avec les paramêtres dans la pile
Donc il faut une "glue function" qui fasse la conversion pour chaque fonction (=wrapper)
C'est les pointeurs de ces glue functions qui sont dans la jump table et non pas vos fonctions en C
Je mets dans Toto_functions_glue.h les glue functions et ma jump table


4) Le SDK
On croirais pas mais c'est la partie la plus pénible à faire
Quand on fait une .library il faut fournir tout les fichiers include pour l'utiliser en C
Au minimum il faut : 


 toto/toto.h qui décrit les structures,types,constantes utilisées dans toto
 clib/toto_protos.h
 toto.sfd qui permet de créer un toto.xml  avec l'outil fdtrans


Avec le toto.xml et le clib/toto_protos.h qui définissent totalement nos fonctions on peut alors créer tout les include du SDK avec l'outil idltool y compris les glue functions


5) La compilation
Ce n'est pas un programme donc il faut le compiler sans libnix ni ixemul cad avec -nostartfiles sous GCC
Mais alors on a plus accès à plein de fonction C de base comme printf() qu'il faut émuler tant bien que mal sous OS3
Là il vaut mieux regarder mon code tout en sachant que c'est certainement pas optimal


Alain Thellier


Cet article provient de Le site des utilisateurs francophones actuels et futurs d'AmigaOS 4.x
https://amiga-ng.org/viewtopic.php?topic=1975&forum=14