6
votes

Génération d'une erreur de liaison-temps pour les fonctions obsolètes

Y a-t-il un moyen avec GCC et GNU Binutils pour marquer certaines fonctions telles qu'elles généreraient une erreur au moment de la liaison si elle est utilisée? Ma situation est que j'ai des fonctions de bibliothèque que je ne retire pas pour la compatibilité avec les fichiers binaires existants, mais je souhaite que nous souhaitions que l'absence d'un nouveau binaire nouvellement compilé pour utiliser les fonctions. Je ne peux pas simplement utiliser des attributs GCC de compilation-temps car le code fautif ignore mes en-têtes et détecte la présence des fonctions avec un script configure et prototypage eux-mêmes. Mon objectif est de générer une erreur de liaison pour les scripts configurer afin qu'ils cessent de détecter l'existence des fonctions.

EDIT: une idée .. utiliser l'assemblage pour spécifier le mauvais .Type pour que les points de saisie soient compatibles avec la liaison dynamique mais générer des erreurs de liaison lorsque vous essayez de lier Nouveaux programmes?


0 commentaires

3 Réponses :


0
votes

Le meilleur moyen de générer une erreur de liaison pour des fonctions obsolètes que vous ne voulez pas que les personnes utilisent consiste à s'assurer que les fonctions obsolètes ne sont pas présentes dans les bibliothèques - ce qui en fait une étape au-delà de «déprécis».

Peut-être que vous pouvez fournir une bibliothèque auxiliaire avec la fonction obsolète de celui-ci; Les réprobates qui ne paieront pas d'attention peuvent être liées à la bibliothèque auxiliaire, mais les personnes dans le grand public n'utiliseront pas la bibliothèque auxiliaire et n'utiliseront donc pas les fonctions. Cependant, il le prend toujours au-delà de la phase «obsolète». P>

Obtenir un avertissement de temps de liaison est délicat. Clairement, GCC fait cela pour certaines fonctions ( mktemp () code> et al) et Apple a mis en garde GCC si vous exécutez un programme utilisant obtient () code>. Je ne sais pas ce qu'ils font pour que cela se produise. P>


À la lumière des commentaires, je pense que vous devez diriger le problème au moment de la compilation, plutôt que d'attendre le temps de liaison ou Temps d'exécution. p>

Les attributs GCC incluent (à partir du manuel GCC 4.4.1): P>

warning ("message")


3 commentaires

Les avertissements peuvent être effectués avec le .gnu.warning note, mais je ne connais pas d'équivalent pour générer des erreurs. Malheureusement, alors que votre solution est la meilleure, elle ne répond pas à mes besoins de correspondance à la fois un abi obsolète et de relier de nouvelles applications.


@R ..: assez juste. Est-il juste de dire que vous voulez une copie des bibliothèques installées; Vous voulez des applications pré-compilées (qui peuvent utiliser l'interface obsolète) pour continuer à courir; Vous souhaitez que les applications nouvellement compilées utilisent l'interface obsolète pour ne pas relier à un lien? Dans l'affirmative, et si les détecteurs de configuration repéreront les fonctions obsolètes, comment envisagez-vous d'avoir des personnes de réparer les choses afin que le code finit par liaison avec les interfaces modernes (non obsolètes)?


Il n'y a pas de nouvelle interface de remplacement; Essayer d'utiliser ces interfaces obsolètes n'est que nuisible et le comportement correct n'est pas de les utiliser du tout. Malheureusement, je n'ai pas de contrôle sur le logiciel cassé qui tente de les utiliser, et alors que je pouvais probablement obtenir les responsables de la réparation de nouvelles versions, les utilisateurs pourraient toujours essayer de compiler de vieilles versions pour un bon moment.



0
votes

Une idée pourrait être de générer une bibliothèque de stub qui a ces symboles mais avec des propriétés inattendues.

  • peut-être créer des objets qui ont le nom des fonctions, de sorte que la liaison de la phase de configuration pourrait se plaindre que les symboles ne sont pas compatibles
  • Créer des fonctions qui ont une dépendance " dont_use_symbol_xxx " qui n'est jamais résolu
  • ou faux un fichier .a avec un indice global qui aurait vos fonctions, mais où les membres .O dans les archives ont le mauvais format

0 commentaires

2
votes

FreeBSD 9.x fait quelque chose de très proche de ce que vous voulez avec la fonction ttySlot () code>. Cette fonction n'a pas de sens avec UTMPX. L'astuce est qu'il n'y a que des versions non par défaut de ce symbole. Par conséquent, ld code> ne le trouvera pas, mais RTLD trouvera la définition des versions versées lorsqu'un ancien binaire est exécuté. Je ne sais pas ce qui se passe si un vieux binaire a une référence non avancée, mais il est probablement raisonnable s'il n'y a qu'une seule définition.

Par exemple, P>

__asm__(".symver new_badfunc, badfunc@@MYLIB_1.1");


1 commentaires

Pourriez-vous expliquer mieux comment cela fonctionne ou fournissez un lien? On dirait que cela pourrait répondre à mes besoins.