Existe-t-il un moyen d'exposer un symbole uniquement à dlsym
et de le masquer lors d'une liaison statique et dynamique?Masquer le symbole lors de la liaison statique et dynamique, exposer à dlsym pour le chargement dynamique
Ce que je voudrais faire est d'autoriser les fichiers objets qui peuvent être utilisés comme bibliothèques partagées ou plugins sans modification. Si les fichiers objet doivent être utilisables en tant que bibliothèques, les collisions de symboles doivent être évitées. Malheureusement, cela signifie que lorsqu'il est utilisé en tant que plugins, le nom de la fonction que dlsym
utilisera pour initialiser le plugin doit être différent pour chaque plugin. CPython résout cela en rapportant le nom du symbole dlsym
cherchera le nom de fichier de l'objet partagé. C'est une bonne solution mais elle casse si les objets partagés sont renommés. Au lieu de cela, je préférerais que les plugins exposent un nom de fonction d'initialisation commun à dlsym
mais que ce nom soit ignoré si l'objet partagé est lié dynamiquement. (Dans ce cas, l'initialisation se ferait d'une autre manière.)
Editer: Je me suis trompé sur la prémisse de la question. Avec les librairies dynamiques A et B qui exportent des symboles identiques, si un programme les relie à deux, cela ne provoque pas d'erreur de lien.
Je ne pense pas que ce soit possible, La seule solution est de créer deux bibliothèques. http://stackoverflow.com/questions/2222162/how-to-apply-gcc-fvisibility-option-to-symbols-in-static-libraries. – Stargateur
La solution la plus simple serait * de ne pas lier * à votre bibliothèque. – tofro
@tofro Huh? La question demande littéralement comment je peux permettre à ces bibliothèques d'être liées. – Praxeolitic