La norme POSIX ajoute de nombreuses fonctions de bibliothèque et d’autres identifiants au langage C. Dans la description de la fonction dlsym()
, il est dit (avec mon accentuation):
SYNOPSIS
#include void *dlsym(void *ressortingct handle, const char *ressortingct name);
LA DESCRIPTION
La fonction dlsym () doit obtenir l’adresse d’un symbole (un identifiant de fonction ou un identifiant d’object de données) …
La norme C ne garantit pas qu’un pointeur de fonction puisse être converti en void *
, ni même que la taille des pointeurs rest la même. Cela ajoute effectivement une ressortingction supplémentaire sur le système de types de C.
Ma question est la suivante:
sizeof ( function pointer ) > sizeof (void *)
? dlsym()
La référence à dlsym () indique que la conversion n’est pas définie par le standard C, mais qu’une implémentation conforme doit faire en sorte que cela fonctionne correctement. Donc, sur les systèmes où cela ne peut fonctionner, cela ne serait pas une implémentation conforme et documenterait probablement ceci:
Notez que la conversion d’un pointeur * vide en un pointeur de fonction comme dans:
fptr = (int (*)(int))dlsym(handle, "my_function");
n’est pas défini par la norme ISO C. Cette norme nécessite que cette conversion fonctionne correctement sur les implémentations conformes.
il y a un ancien article qui parle de cela du sharepoint vue C ++ et qui renvoie à une ancienne version de la référence dlsym () avec une explication plus détaillée:
La norme ISO C n’exige pas que les pointeurs vers les fonctions puissent être redirigés en pointeurs vers les données. En effet, la norme ISO C n’exige pas qu’un object de type void * puisse contenir un pointeur sur une fonction. Les implémentations prenant en charge l’extension XSI nécessitent toutefois qu’un object de type void * puisse contenir un pointeur sur une fonction. Toutefois, le résultat de la conversion d’un pointeur en fonction en un pointeur vers un autre type de données (à l’exception de void *) n’est pas défini. Notez que les compilateurs conformes à la norme ISO C sont tenus de générer un avertissement si une conversion d’un pointeur void * en pointeur de fonction est tentée comme suit:
fptr = (int (*)(int))dlsym(handle, "my_function");
En raison du problème noté ici, une version future peut soit append une nouvelle fonction pour renvoyer des pointeurs de fonction, soit rendre l’interface actuelle obsolète au profit de deux nouvelles fonctions: l’une qui renvoie les pointeurs de données et l’autre qui renvoie les pointeurs de fonction.