La liaison avec d'anciennes symbole de la version .si le fichier

À l'aide de gcc et de ld sur linux x86_64-je besoin de le lier avec une version plus récente d'une bibliothèque glibc (2.14), mais l'exécutable doit s'exécuter sur un système avec une version plus ancienne (2.5). Puisque le seul incompatible symbole est memcpy (besoin memcpy@GLIBC_2.2.5 mais la bibliothèque fournissant memcpy@GLIBC_2.14), je voudrais dire à l'éditeur de liens qui au lieu de prendre la version par défaut de memcpy, il devrait prendre une ancienne version je précise.

J'ai trouvé un très arkward façon de le faire: il suffit de spécifier une copie de l'ancien .si le fichier à la ligne de commande liens. Cela fonctionne bien, mais je n'aime pas l'idée d'avoir plusieurs .les fichiers (je ne pouvais faire le travail en spécifiant toutes les anciennes bibliothèques de je lien qui ont également des références à memcpy) a vérifié dans le svn et de mon système de construction.

Donc je suis à la recherche d'un moyen de dire à l'éditeur de liens de prendre l'ancien versionnées symbole.

Des solutions de rechange qui ne fonctionnent pas (bien) pour moi sont:

  • À l'aide de l'asm .symver (comme on le voit sur Archive Web de Trevor Livres Blog) car cela m'obligerait à assurez-vous que le symver est avant tout le code qui est à l'aide de memcpy, ce qui serait très dur (complexe de la base de code dans la 3ème partie du code)
  • Le maintien d'un environnement de compilation avec les anciennes bibliothèques; tout simplement parce que je veux développer sur mon ordinateur de bureau et il serait un pain pita à la synchronisation des trucs autour de notre réseau.

Lorsque vous pensez à toutes les tâches d'un éditeur de liens, il ne semble pas être une chose difficile à imlpement, après tout il a un peu de code pour comprendre la version par défaut d'un symbole aussi.

Toutes les autres idées qui sont sur le même niveau de complexité comme un simple éditeur de liens de ligne de commande (comme la création d'un simple éditeur de liens (linker script, etc.) sont aussi les bienvenus, tant qu'ils ne sont pas bizarre hacks en éditant le binaire résultant...

edit:
Pour conserver ce pour les futurs lecteurs, en plus de la ci-dessous des idées, j'ai trouvé l'option --wrap à l'éditeur de liens, ce qui peut être utile parfois trop.

  • Vous savez, memcpy( ) n'a pas changé en trente ans. Vous pourriez mentionner pourquoi vous avez besoin de cela. (Je m'excuse pour demander pourquoi, et je déteste quand les gens le faire. Mais vous devez avoir un réel impératif de la raison qui pourrait être crucial de savoir, étant donné que memcpy() a été stable pendant si longtemps.) Merci!
  • Tout simplement parce que quand j'ai créer mon programme de lutte contre la glibc 2.14 il ne fonctionne pas sur un système avec un ancien de la glibc, puisque ceux-ci ne fournissent pas de la version du symbole memcpy@GLIBC_2.14
  • Ma réponse liens un rapport de bug expliquant memcpy problème, en termes de ce qui a réellement changé - glibc fait un changement qui casse le code qui s'appuient sur la (techniquement pas défini dans le chevauchement des cas) sans-papiers", toujours effectuer une itération à partir de la gauche vers la droite" le comportement de unix traditionnel memcpy implémentations. Plus pertinent pour la question ici, cependant, est le fait que l'ancienne version est évidemment la seule prévue dans les précédentes versions de la glibc qui il doit soutenir.
  • Voir aussi: stackoverflow.com/a/39537664/1546337
  • Ce lit plausible: gcc.gnu.org/ml/gcc-help/2008-11/msg00303.html
  • comment alors? Les versions de symboles existe à cet effet. Donc, si je décide que l'ancienne version avec son vieux sémantique me convient, pourquoi ne pas être en mesure de relier à l'encontre de qui? De tous les nombreux symboles dans la glibc, seulement realpath et memcpy jamais, se sont tenus à la correction. Et il n'y a pas de réel problème à lire dans le journal de modification, de comparaison de code source et de trouver que l'ancienne version n'est ce que l'on attend de lui ...

InformationsquelleAutor PlasmaHH | 2012-01-11