Vous mélangez beaucoup de concepts. Une adresse relative est juste une adresse qui a besoin d'une adresse de base à convertir en une adresse absolue. Cette conversion peut se produire de plusieurs façons. Un est en train de les convertir au moment du chargement, mais ils peuvent aussi être utilisés avec des instructions CPU qui supportent intrinsèquement l'adressage relatif en effectuant le calcul juste quand l'emplacement mémoire doit être accédé.
Si un système d'exploitation prend en charge la mémoire virtuelle, toutes les adresses utilisées dans un processus ordinaire sont logiques, qu'elles soient référencées relatives ou absolues. La conversion d'adresses logiques en adresses physiques est en dehors de la portée de l'application et indépendante de tout autre concept auquel vous faites référence dans votre question.
Le format de fichier de classe ne fonctionne pas en termes d'emplacements de mémoire.
Si vous souhaitez appliquer les termes «absolu» et «relatif» à ce niveau supérieur, les indices de pool constant sont absolus car ils ne nécessitent pas d'index de base pour identifier l'index réel. Cependant, lorsque vous souhaitez trouver l'emplacement de la mémoire dans le fichier chargé, vous devez non seulement utiliser l'adresse à laquelle le fichier de classe a été chargé, mais également analyser l'intégralité du pool de constantes jusqu'à l'élément souhaité. différentes tailles d'octets. Pour cette raison, les articles ne sont généralement pas regardés du tout. Au lieu de cela, l'ensemble du pool est converti en une représentation spécifique JVM ayant des tailles d'éléments constantes en une seule passe et plus tard, la JVM peut rechercher des entrées de cette table, qui est indépendante de l'emplacement mémoire du fichier classe.Dans les instructions de code octet, les décalages relatifs sont utilisés, ce qui nécessite d'ajouter la position de l'instruction actuelle pour obtenir une position absolue, mais notez comment cela ne rentre pas dans les concepts nommés dans votre question. Les positions absolues sont toujours des positions dans une séquence d'instructions et, par conséquent, par rapport à l'emplacement mémoire du code quand on parle d'adresses. De plus, les décalages relatifs ne sont pas utilisés car "la liaison n'est pas possible au moment de la compilation", les positions absolues résultantes sont connues au moment de la compilation. Le jeu d'instructions Java byte code est juste défini pour utiliser des décalages relatifs pour permettre un code plus compact. Du point de vue d'un ensemble d'instructions, nous pourrions dire qu'il supporte intrinsèquement l'adressage relatif. La façon dont la JVM implémente réellement son exécution dépend de la JVM.
Depuis you mentioned the JVM’s native code generation, lorsqu'une machine virtuelle Java génère du code natif, elle connaît l'adresse cible du code et peut décider librement d'utiliser des adresses relatives ou absolues, comme elle convient. Comme déjà mentionné, tout ce qui est décrit ci-dessus se passe dans un processus, donc si le système d'exploitation utilise la mémoire virtuelle, tout est en termes d'adresses logiques qui peuvent être adaptées par le système d'exploitation, par ex. via MMU. Ces concepts ne sont pas liés.
Vous avez tiré la question dans le pied en introduisant RELOCATABLE. C'est un concept indépendant qui est bien au-delà de votre compréhension à ce stade. –
@BruceDavidWilner Autant que je m'en souvienne. Il peut y avoir deux types de liaison d'adresse. Relatif à logique, et logique à relatif. Ans parfois l'adresse relative et les termes d'adresse relocalisables sont utilisés de manière interchangeable. C'est pourquoi j'ai utilisé ce terme. – zgulser
@BruceDavidWilner Mais je suis d'accord avec vous. Relocatable plus fait référence à des adresses encore non résolues (si vous le vouliez). – zgulser