Comment sont liées les variables globales dans les bibliothèques partagées?

Supposons que je partage la bibliothèque avec cette fonction où “i” est une variable globale.

int foo() { return i++; } 

Lorsque j’appelle cette fonction à partir de plusieurs processus, la valeur de “i” dans chaque processus est indépendante des autres processus.

Ce comportement est assez attendu.

Je me demandais comment ce comportement est-il implémenté par l’éditeur de liens? D’après ce que je comprends, le code est partagé entre les processus, donc la variable doit avoir la même adresse virtuelle dans tous les espaces d’adressage de tous les programmes utilisant cette bibliothèque. Cette condition me semble difficile à réaliser, alors je suppose que quelque chose me manque et que cela se fait différemment.

Puis-je obtenir des informations plus détaillées sur ce sujet?

Le processus de liaison dynamic au moment de l’exécution (similaire au processus de liaison statique) alloue des segments de données (et bss) distincts pour chaque processus et les mappe dans l’espace d’adressage du processus. Seuls les segments de texte sont partagés entre les processus. De cette façon, chaque processus obtient sa propre copie des données statiques.

le code est partagé entre les processus, donc la variable doit avoir la même adresse virtuelle dans tous les espaces d’adressage de chaque programme qui utilise cette bibliothèque

Le code n’est pas partagé comme vous le pensez. Oui, l’object partagé dynamic n’est chargé qu’une seule fois, mais les références mémoire, la stack ou le segment de mémoire utilisé par le code ne sont pas partagés. Seule la section contenant le code est partagée.

Chaque processus possède son propre espace d’adressage, de sorte que lorsqu’un processus accède à la variable, il peut avoir des valeurs différentes de celles de l’autre processus. Si le processus devait partager la même mémoire, ils devraient le configurer spécifiquement. Une bibliothèque partagée ne suffit pas pour cela.