2017-01-12 1 views
1

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.

+0

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

+0

La solution la plus simple serait * de ne pas lier * à votre bibliothèque. – tofro

+0

@tofro Huh? La question demande littéralement comment je peux permettre à ces bibliothèques d'être liées. – Praxeolitic

Répondre

3

Non, dlsym et le partage de liens dynamiques partagent donc il n'est pas possible de cacher le symbole de l'un lors de l'exposition à l'autre.

Ce que vous pourriez faire dans votre cas particulier est d'utiliser le même nom de fonction (ou, mieux, littéral de chaîne exporté) pour tous les plugins. Ensuite, vous pouvez parcourir tous bibliothèques partagées chargées et interroger pour cette fonction via dlsym(handle, common_name).