1 votes

Comment détecter un symbole non résolu lors de la création d'une bibliothèque?

Sous Solaris 10, je crée une bibliothèque A.so qui appelle une fonction f() définie dans la bibliothèque B.so. Pour compiler la bibliothèque A.so, je déclare dans mon code f() en tant qu'externe.

Malheureusement, j'ai "oublié" de déclarer dans le makefile de A qu'il doit se lier avec B. Cependant, "make A" ne génère aucun avertissement, aucune erreur, et la bibliothèque A.so est créée.

Évidemment, lors de l'exécution du code de A, l'appel à f() plante car il est indéfini.

Existe-t-il un moyen (option de lien, astuce de code...) pour que la compilation de la bibliothèque A échoue ? Comment puis-je être sûr que tous les symboles référencés dans la bibliothèque A sont définis au moment de la compilation ?

Merci pour toutes les suggestions.

1voto

Virgil Points 1693

Moyen le plus simple : ajouter une cible "test_lib" dans le makefile, qui produira un exécutable utilisant tous les symboles exportés par la bibliothèque A. (ne doit pas forcément être significatif... il suffit de prendre l'adresse, pas besoin d'appeler la fonction ou quoi que ce soit, il suffit qu'elle soit référencée).

1voto

oussama fahd Points 31

Réservoirs

Je pense avoir trouvé quelque chose d'intéressant et encore plus simple dans le manuel du lien (d'ho)

L'option -z defs et l'option --no-undefined provoquent une erreur fatale si des symboles non définis subsistent à la fin du lien. Ce mode est le mode par défaut lorsqu'un exécutable est construit. Pour des raisons historiques, ce mode n'est pas le mode par défaut lors de la construction d'un objet partagé. L'utilisation de l'option -z defs est recommandée, car ce mode assure que l'objet en cours de construction est autonome. Un objet autonome a toutes les références symboliques résolues de manière interne, ou aux dépendances immédiates de l'objet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X