Brevet FR3016979A1 — publié le 20150731

Procédé de désambiguïsation de code DOMAINE TECHNIQUE DE L'INVENTION [0001] L'invention se rapporte à un procédé de désambiguïsation de code et en particulier de code exécutable. [0002] On entendra par code exécutable dans le cadre de la présente demande toutes séquences d'octets chargeables pour exécution par un système d'exploitation. Sont en particulier visés, mais non exclusivement, les formats ELF (Executable an Linkable Format, pour Format exécutable et liable), a.out et PE (Portable Executable, pour Exécutable Portable). D'une manière générale, sont également visés les fichiers dits exécutables et les fichiers dits bibliothèques, sous-entendu de code exécutable. ETAT DE LA TECHNIQUE ANTERIEURE [0003] Certaines applications impliquent la mise en oeuvre d'une pluralité de bibliothèques. Chaque bibliothèque exporte des fonctions utilisables par d'autres exécutables ou bibliothèques qui la référencent. On dit alors que ces autres fichiers dépendent de la bibliothèque. Chaque fonction exportée a un nom qui l'identifie. [0004] Des problèmes se posent au moins dans les cas suivants : - Deux bibliothèques différentes exportent une fonction ayant le même nom, - Un fichier E dépend de deux bibliothèques libA qui exporte une fonction fa et libB qui exporte une fonction fb. La fonction fa appelle une fonction fc d'une version vl d'une bibliothèque libC. libA dépend donc d'une version vl de libC, La fonction fb appelle une fonction fc d'une version v2 de libC. libB dépend donc d'une version v2 de libC. Dans ce cas, à l'exécution, lors d'un appel à fa ou fb il y a une ambiguïté sur la version de la fonction fc à charger. Dans ce cas le programme échoue et s'arrête avec un message d'erreur ou le comportement du programme est indéfini. [0005] Dans l'état de la technique lorsqu'un tel problème est détecté, on effectue, si possible, une « refactorisation » de code source. Cela signifie que l'on effectue un nouveau cycle de développement pour résoudre les ambiguïtés de nommage. Dans l'exemple cité il faudrait changer le code source de l'une des versions de la bibliothèque libC pour y renommer la fonction fc. Cela implique de : - disposer du code source de la bibliothèque, c'est rarement le cas, - créer une autre version, spécifique, de la bibliothèque donc complexifier la gestion du développement de libC et de E. [0006] Une telle refactorisation est de plus une opération lourde puisqu'elle implique une nouvelle validation de tous le code qui est impacté, c'est-à-dire une reprise de tous les tests unitaires et ou fonctionnels pour vérifier l'absence d'impact sur le comportement de l'application utilisant le code modifié. [0007] Cela représente donc une charge de travail importante et difficilement automatisable. EXPOSE DE L'INVENTION [0008] L'invention vise à remédier à tout ou partie des inconvénients de l'état de la technique identifiés ci-dessus, et notamment à proposer des moyens pour permettre d'adapter les versions d'une bibliothèque sans avoir à accéder ni à modifier son code source. [0009] Dans l'invention on utilise un fichier de configuration qui spécifie, des instructions de renommage de symboles. Une instruction permet de sélectionner un ou plusieurs symboles dans une table de symboles et de spécifier, pour les symboles sélectionner une règle de renommage. La sélection des symboles se fait, par exemple, selon leur nature (exporté ou importé) et/ou selon leur nom. De la même manière le fichier de configuration comporte des instructions de renommage des dépendances. Dans ce dessein, un aspect de l'invention se rapporte à un procédé de désambiguïsation d'un fichier de code exécutable comportant une table des symboles caractérisé en ce qu'il comporte les étapes suivantes : - lecture d'une configuration de désambiguïsation comportant au moins une instruction de renommage de symbole, - renommage de symboles d'une table des symboles selon au moins une instruction de renommage de symbole de la configuration de désambiguïsation. - enregistrement du fichier de code désambiguïsé selon la configuration de désambiguïsation. [0010] Outre les caractéristiques principales qui viennent d'être mentionnées dans le paragraphe précédent, le procédé/dispositif selon l'invention peut présenter une ou plusieurs caractéristiques complémentaires parmi les suivantes, considérées individuellement ou selon les combinaisons techniquement possibles: - le fichier de code exécutable comportant une table des dépendances, le procédé comporte les étapes suivantes : - lecture d'une configuration de désambiguïsation comportant au moins une instruction de renommage de dépendance, - renommage de dépendances de la table des dépendances selon au moins une instruction de renommage de dépendance de de la configuration de désambiguïsation ; - qu'une instruction de renommage comporte au moins : - un critère de sélection d'un symbole ou d'une dépendance, - une règle de dérivation d'un nom dépendant au moins du nom du symbole ; - qu'un critère de sélection d'un symbole comporte un code de nature de symbole selon qu'il faut sélectionner un symbole exporté ou un symbole importé ; - qu'un critère de sélection est un masque de type expression régulière appliqué au nom d'un symbole ou d'une dépendance ; - une règle de dérivation prend en compte une information de version du fichier de code exécutable à produire. L'invention se rapporte également à un dispositif de stockage numérique stockant un programme exécutable par une machine et composé d'instructions réalisant le procédé selon une combinaison des caractéristiques précédemment citées. BREVE DESCRIPTION DES FIGURES [0011] D'autres caractéristiques et avantages de l'invention ressortiront à la lecture de la description qui suit, en référence aux figures annexées, qui illustrent : - la figure 1, une vue schématique d'un fichier exécutable ; - la figure 2, une illustration d'étapes du procédé selon l'invention. [0012] Pour plus de clarté, les éléments identiques ou similaires sont repérés par des signes de référence identiques sur l'ensemble des figures. [0013] L'invention sera mieux comprise la lecture de la description qui suit et à l'examen des figures qui l'accompagnent. Celles-ci sont présentées à titre indicatif et nullement limitatif de l'invention. DESCRIPTION DETAILLEE D'UN MODE DE REALISATION [0014] A la figure 1 est illustrée, de manière schématique, la structure d'un fichier exécutable. La figure 1 montre un fichier 100 exécutable. Un tel fichier est usuellement enregistré sur des moyens de stockage. Un tel fichier est usuellement chargé en mémoire de travail en vue de l'interprétation de son contenu par un microprocesseur. Ici l'emploi du terme interprétation ne présume aucunement de la nature du contenu du fichier. Il s'agit bien de code binaire chargeable en mémoire. [0015] Le fichier 101 exécutable comporte une zone 101 entête. L'entête 101 décrit la structure du fichier. Entre autre l'entête 101 indique, via différents champs, des offsets de différentes sections du fichier 101 exécutable. Un particulier un premier champ 102 de l'entête 101 donne l'offset d'une section 103 table des symboles. Un offset est classiquement une distance en octets relative au début du fichier ou à la fin de l'entête. [0016] Un symbole est une référence à une zone de code ou de donnée dans un fichier exécutable. Un symbole est un moyen de décrire une zone à lire ou à écrire. [0017] La section 103 table des symboles est usuellement structurée en table, 25 chaque ligne de la table correspondant à un symbole. Une ligne comporte au moins trois colonnes : - Une colonne 104 nom du symbole, - Une colonne 105 type du symbole, - Une colonne 106 offset du symbole. 30 [0018] Le nom du symbole est utilisé comme entrée de la table des symboles, c'est-à-dire comme identifiant du symbole lors de l'exécution du fichier 101 exécutable, ou lors de l'utilisation du fichier 101 exécutable pour une édition de liens dans un processus de production de code exécutable. [0019] Le type spécifie si le symbole est importé ou exporté. Le symbole est exporté s'il est utilisable par d'autre fichier exécutable que celui qui comporte la table de symboles. Le symbole est importé s'il faut aller cherche la zone de code ou de donnée correspondante dans un autre fichier exécutable que celui comportant la table des symboles. [0020] La colonne 106 offset du symbole comporte un offset si le symbole est exporté. Si le symbole est importé, alors la colonne 106 offset comporte : - Soit une indirection vers une ligne d'une table de dépendances - Soit un nom d'un fichier exécutable comportant le code ou la donnée du symbole à importer. Dans ce deuxième cas, la table des symboles est également une table des dépendances. [0021] Une table des dépendances est, d'une manière simplifiée, une liste indexée de noms de fichiers exécutables. La connaissance de l'offset de la table des dépendances, via un champ de l'entête 101 par exemple, et la connaissance d'un index, via la colonne 106 offset de la table des symboles, permet d'accéder au nom du fichier exécutable. [0022] La figure deux montre une étape 201 de lecture d'une configuration de désambiguïsation. Une configuration de désambiguïsation est enregistrée dans un fichier de désambiguïsation. Tout où partie des paramètres du fichier de configuration de désambiguïsation pourrait être fourni en ligne de commande. [0023] Le procédé selon l'invention est mise en oeuvre par un ordinateur 301 de traitement comportant un microprocesseur 302 connecté à des moyens 303 de stockage via un bus 304. Le procédé selon l'invention correspond donc à des codes instructions enregistrés sur les moyens 303 de stockage et désignées par un nom de fichier. Le procédé selon l'invention est donc invoqué via le nom du fichier correspondant. Ce nom est, par exemple, saisie dans une fenêtre de commande, aussi appelé console. Ce nom peut être suivi d'un ou plusieurs paramètres. [0024] Lorsque l'on prête une action à un microprocesseur ou à un ordinateur, celle-ci est en fait réalisée par le microprocesseur commandé par des codes instructions chargé dans une mémoire de travail. [0025] Un fichier de configuration de désambiguïsation comporte : - Un identifiant d'un fichier à traiter, ainsi qu'un nouveau nom pour le fichier résultant du traitement, - Une ou plusieurs instructions de renommage - Aucun, un ou plusieurs paramètres de renommage. [0026] Une instruction de renommage porte soit sur un symbole, soit sur une dépendance. Ainsi une instruction de renommage à la structure suivante : - Un code de désignation selon que l'on souhaite renommer un symbole ou une dépendance, - Un masque de sélection interprété selon le code de désignation - Une règle de dérivation d'un nouveau nom. [0027] Les codes de désignation selon que l'on souhaite renommer un symbole ou une dépendance sont des valeurs arbitraires, par exemple : - 1 pour un symbole, - 2 pour une dépendance. [0028] Un masque est par exemple selon l'une des syntaxes parmi les suivantes pour l'ensemble des instructions de renommage : - Un nom complet d'un symbole, dans ce cas on cherche un symbole dont le nom correspond exactement, - Un masque de type SQL, avec les caractères jokers - _ pour un et un seul caractère quelconque - % n'importe quel caractère dans n'importe quel nombre de zéro à aucune limite - Un masque de type sélecteur de fichier avec les caractères jokers : - ? pour un et un seul caractère quelconque - * n'importe quel caractère dans n'importe quel nombre de zéro à aucune limite - Une expression régulière. [0029] Cette liste d'exemples de syntaxe n'est pas limitative. [0030] Le cas de l'expression régulière est intéressant car il permet d'effectuer des captures de parties de chaîne pouvant servir à la construction d'un nouveau nom pour le symbole. [0031] Si l'on souhaite utiliser plusieurs syntaxes de masque de sélection dans un même fichier de configuration de désambiguïsation, alors il faut ajouter une information à la structure de l'instruction de renommage, cette information ajoutée étant un code permettant de spécifier la manière dont le masque doit être interprété. [0032] Une règle de dérivation est, par exemple : - Une chaîne compatible avec l'instruction du langage C printf, les autres paramètres de l'instruction printf étant, dans un ordre prédéterminé, le nom du symbole ou de la dépendance, les paramètres de renommage. On a cité une instruction du langage C mais on peut aussi utiliser d'autre langage comme C# et dans ce cas l'instruction String.Format - Une chaîne de remplacement dans le cadre de l'utilisation d'une expression régulière. Dans ce cas on cite comme exemple la fonction preg_replace du langage PHP. [0033] Dans l'étape 201 l'ordinateur 301 charge un fichier 305 de configuration de désambiguïsation. Cela permet à l'ordinateur 301 de connaître : - un fichier 306 à traiter, il s'agit d'un fichier enregistré sur les moyens 303 de stockage de l'ordinateur 301 de traitement, - Le nom du fichier à produire, - Des paramètres de renommage, - Une liste d'instruction de renommage, [0034] De l'étape 201, l'ordinateur 301 de traitement passe à une étape 202 de chargement de la liste des symboles. Pour simplifier on se place dans le cas où la table des symboles est aussi une table des dépendances. Dans l'étape 202 de chargement l'ordinateur 301 accède à la table des symboles du fichier 306 à traiter via l'entête de ce fichier. [0035] Une fois la table des symboles chargée, l'ordinateur 301, dans une étape 203 analyse chaque symbole pour déterminer si une des instructions de renommage correspond au symbole. L'analyse se déroule comme suit si il existe une règle de renommage dont le code de désignation vaut 1 et dont le masque de sélection correspond au nom du symbole remplacer le nom du symbole par le résultat de l'application de la règle de dérivation correspondant à la règle fin si si le symbole est exporté si il existe une règle de renommage dont le code de désignation vaut 2 et dont le masque de sélection correspond à la dépendance du symbole remplacer le nom de la dépendance par le résultat de l'application de la règle de dérivation correspondant à la règle fin si fin si [0036] Ces pseudos instructions sont exécutées pour chaque symbole de la table des symboles et, le cas échéant, pour chaque dépendance de la table des 10 dépendances. [0037] De l'étape 203 d'analyse de chaque symbole l'ordinateur 301 passe à une étape 204 d'enregistrement du fichier modifié selon la configuration de désambiguïsation chargée à l'étape 201 de chargement de la configuration dans un fichier dont le nom a également été chargé à l'étape 201. 15 [0038] Dans une variante de l'invention, la sélection des symboles à traiter se fait selon qu'ils sont importés ou exportés. Dans ce cas, une instruction de renommage comporte, dans sa structure, un code spécifiant si elle s'applique aux symboles exportés, importés ou au deux. [0039] Dans un exemple on considère une instruction de dérivation du type : 20 10}v{1}' [0040] Cela signifie, par exemple que le nouveau nom du symbole sera : ancien nom + v + premier paramètre de renommage. Le premier paramètre de renommage, fourni dans le fichier de configuration de désambiguïsation, est, par exemple, un numéro de version du fichier traité. 25 [0041] Dans une variante intégrée de l'invention on n'utilise qu'une instruction de renommage pour les symboles exportés. Cette règle est de renommer tous les symboles exportés en tenant compte de la version du fichier traité. Cette version est obtenue, au choix et de manière non limitative : - Par un paramètre de ligne de commande 30 - Par un fichier de configuration - Par analyse de l'entête du fichier traité - Par analyse du nom du fichier traité qui est alors du type nomFichier.version.extension. Dans cette variante intégrée le fichier résultat du traitement est un fichier nommé selon un numéro de version. Par exemple ce nom est nomFichier.version.extension ou : - nomFichier est le nom du fichier à traiter - extension est l'extension du fichier à traiter, s'il en a une - version est la valeur du paramètre de version. Si ce nom est le même que le nom du fichier à traiter alors soit le fichier résultant du traitement remplace le fichier d'origine, soit le fichier résultant du traitement est enregistré à un autre emplacement, c'est-à-dire dans un autre répertoire. [0042] Dans la variante intégrée des instructions de renommage peuvent être intégrées au code exécutable correspondant à l'invention. Dans ce cas elles sont chargées en même temps que le code exécutable correspondant à l'invention. [0043] Ainsi si on considère un fichier E qui importe : - une fonction fa d'un fichier LibA qui lui-même importe une fonction add d'une version 1 d'un fichier LibC - une fonction fb d'un fichier LibB qui lui-même importe une fonction add d'une version 2 du fichier LibC Alors on effectue les opérations de désambiguïsation suivante : - LibC vers LibC.v1 en renommant les symboles exportés en les post fixant par v1, ou _v1 ou une chaîne de caractère équivalent prenant en compte au moins la version du fichier résultat du traitement - LibC vers LibC.v2 en renommant les symboles exportés en les post fixant par v2, ou _v2 ou une chaîne de caractère équivalent prenant en compte au moins la version du fichier résultat du traitement - LibA vers LibA.v1 en renommant les symboles importés depuis LibC en les postfixant de manière cohérente avec le renommage effectué pour obtenir LibC.v1 et en renommant la dépendance à LibC en dépendance à LibC.v1 - LibB vers LibB.v1 en renommant les symboles importés depuis LibC en les post fixant de manière cohérente avec le renommage effectué pour obtenir LibC.v2 et en renommant la dépendance à LibC en dépendance à LibC.v2 - E vers E en renommant : - La dépendance LibA en LibA.v1 - La dépendance LibB en LibB.v1 Dans l'exemple illustratif ci-dessus, le fait de changer les noms de LibA et de LibB, et donc de traiter E, est facultatif. Le fait de le décrire participe à l'illustration de l'invention. [0044] Ainsi du point de vue du fichier E les ambiguïtés liées aux appels à la fonction « add » ont été levées. Les objectifs de l'invention sont donc bien atteints. [0045] On a décrit un dispositif de stockage numérique pour stocker un programme exécutable par une machine et composé d'instructions réalisant le procédé selon l'invention comme étant un disque dur mais il est entendu qu'il peut s'agir de tout support, amovible ou non. Par exemple il pourrait s'agir d'une clé USB, d'un CD, DVD ou « BlueRay Disc ». Cette liste n'est pas limitative. REVENDICATIONS1. Procédé mis en oeuvre par un ordinateur de désambiguïsation d'un fichier de code exécutable comportant une table des symboles caractérisé en ce qu'il comporte les étapes suivantes : lecture (201) d'une configuration de désambiguïsation comportant au moins une instruction de renommage de symbole, renommage (202, 203) de symboles d'une table des symboles selon au moins une instruction de renommage de symbole de la configuration de désambiguïsation. enregistrement (204) du fichier de code désambiguïsé selon la configuration de désambiguïsation 2. Procédé de désambiguïsation selon l'une des revendications précédentes, caractérisé en ce que, le fichier de code exécutable comportant une table des dépendances, le procédé comporte les étapes suivantes : lecture d'une configuration de désambiguïsation comportant au moins une instruction de renommage de dépendance, renommage de dépendances de la table des dépendances selon au moins une instruction de renommage de dépendance de de la configuration de désambiguïsation. 3. Procédé de désambiguïsation selon l'une des revendications précédentes, caractérisé en ce qu'une instruction de renommage comporte au moins : un critère de sélection d'un symbole ou d'une dépendance, une règle de dérivation d'un nom dépendant au moins du nom du symbole. 4. Procédé de désambiguïsation selon la revendication 3, caractérisé en ce qu'un critère de sélection d'un symbole comporte un code de nature de symbole selon qu'il faut sélectionner un symbole exporté ou un symbole importé. 5. Procédé de désambiguïsation selon l'une des revendications 3 ou 4 caractérisé en ce qu'un critère de sélection est un masque de type expression régulière appliqué au nom d'un symbole ou d'une dépendance. 6. Procédé de désambiguïsation selon l'une des revendications 3 à 5, caractérisé en ce qu'une règle de dérivation prend en compte une information de version du fichier de code exécutable à produire. 12 3016979 7. Un dispositif (303) de stockage numérique stockant un programme exécutable par une machine et composé d'instructions réalisant le procédé selon l'une des revendications précédentes.