Utilisation appropriée libdl et liée de façon dynamique les bibliothèques
J'ai besoin de lier dynamiquement une bibliothèque que j'ai créé. Je ne suis pas sûr de savoir exactement ce qu'est la question. Tout se compile correctement, mais j'ai toujours attraper handle
comme le NULL
pointeur:
void *handle;
char *error;
handle = dlopen ("./hw11-lib-michaelSchilling.so", RTLD_LAZY);
//same error comes up with full path as well as './hw11...'
if(!handle){
error = dlerror();
printf("%s\n", error);
printf("Error loading library.\n");
exit(1);
}
Je ne peux pas obtenir passé cette erreur et je ne suis pas sûr de ce que pourrait éventuellement être faux. Je suis assez sûr que j'ai compilé tout correctement. Voici la compilation des mesures que j'ai utilisé:
gcc -rdynamic -c hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so
gcc hw11-michaelSchilling-4.c -ldl -o hw11-michaelSchilling-4
J'obtiens une erreur qui lit
seulement ET_DYN et ET_EXEC peut être chargé.
OriginalL'auteur Michael Schilling | 2011-12-03
Vous devez vous connecter pour publier un commentaire.
Lors de la construction de
hw11-lib-michaelSchilling.so
, vous ne semblent pas être diregcc
que vous voulez un objet partagé (le.so
dans le nom n'est pas assez).Avec le
-c
il s'agit de produire un fichier objet (pas un partagé objet) et de l'appelermichaelSchilling.so
. L'éditeur de liens n'a même pas appelé.Supprimer la
-c
de lagcc
ligne de commande et ajouter-shared
:-rdynamic
? Juste essayé avec les deux, et avec juste-shared
, mais j'ai eu la même erreur.Je ne pense pas que
-rdynamic
a rien à voir avec le problème, de sorte que vous pourriez aussi bien le garder en cas de besoin par votre code.Avez-vous supprimé les
-c
?Cela fonctionne, merci pour l'aide!!!!!
OriginalL'auteur NPE
Une barre oblique (
/
) comme premier caractère d'un nom de chemin indique que le chemin est absolu (par rapport au répertoire racine), pas par rapport au répertoire de travail courant et certainement pas par rapport à l'emplacement du binaire. Vous aurez besoin de spécifier le chemin d'accès complet de déterminer l'emplacement du binaire (ce qui n'est pas un problème facile en soi), ou vous pourriez être en mesure d'utiliser$ORIGIN
avecdlopen
(il fonctionne avec rpath mais je suis pas certain que cela fonctionne avecdlopen
)../
)Que fait-il par rapport au répertoire de travail courant, pas l'emplacement de votre programme binaire.
OriginalL'auteur R..
Est
hw11-lib-michaelSchilling.so
dans l'absolu de la racine de votre système de fichiers? Vous êtes à prétendre que c'est par une barre oblique sur elle... mais je pense qu'elle ne l'est pas.Dans votre erreur de manipulation, d'inclure la sortie de
dlerror()
dans ce que vous imprimez, pour trouver la cause de l'échec.Essayez leur fournissant le chemin absolu de l'objet partagé pour voir si cela aide.
Je l'ai fait, et j'ai eu
only ET_DYN and ET_EXEC can be loaded.
OriginalL'auteur mah
fonctionne pour moi sur Linux lors de la compilation de la bibliothèque
pour le code qui s'ouvre, vous devez
-ldl
OriginalL'auteur colmustard