Maison >développement back-end >C++ >Comment l'éditeur de liens C gère-t-il la relocalisation d'adresse pendant le processus de liaison ?

Comment l'éditeur de liens C gère-t-il la relocalisation d'adresse pendant le processus de liaison ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-06 10:25:12715parcourir

How Does the C   Linker Handle Address Relocation During the Linking Process?

Comment fonctionne la liaison C en pratique ?

La liaison en C implique de combiner plusieurs fichiers objets (fichiers .o) pour créer une bibliothèque exécutable ou partagée. Le processus implique diverses étapes, notamment la relocalisation d'adresse et la résolution de symboles.

Relocalisation d'adresse

Une fonction cruciale de la liaison est la _relocalisation d'adresse_. Lorsque le compilateur compile chaque fichier source dans un fichier objet, il génère du code contenant des références à des symboles (fonctions, variables, etc.) définis dans d'autres fichiers source. Cependant, il ne connaît pas les adresses finales de ces symboles tant que tous les fichiers objets ne sont pas liés entre eux.

Pendant la liaison, l'éditeur de liens lit les sections de relocalisation dans les fichiers objets. Ces sections contiennent des informations sur les adresses qui doivent être modifiées dans les sections .text et .data pour pointer vers les emplacements corrects des symboles. L'éditeur de liens ajuste ensuite ces adresses en fonction des emplacements finaux des symboles.

Example

Considérez l'exemple suivant pour illustrer la relocalisation d'adresse :

; object file hello_world.o
.data
hello_world db "Hello world!", 10
.text
.global _start
_start:
    mov rax, 1 ; sys_write
    mov rdi, 1 ; stdout
    mov rsi, hello_world ; placeholder for string address
    mov rdx, 13 ; number of characters to write
    syscall

Lorsque ce fichier .o est compilé, le compilateur insère une valeur d'espace réservé (par exemple, 0) pour l'adresse du "Bonjour tout le monde !" chaîne. L'éditeur de liens lit la section .rela.text de ce fichier :

Offset          Info           Type           Sym. Value    Sym. Name + Addend
00000000000c  000200000001 R_X86_64_64       0000000000000000 .data + 0

Cette entrée indique à l'éditeur de liens qu'au décalage 0x0c (à l'intérieur de l'instruction mov rsi, hello_world), il doit modifier une valeur de 64 bits. pour pointer vers la section .data.

Lorsque l'éditeur de liens combine tous les fichiers objets, il ajuste la valeur au décalage 0x0c pour pointer vers l'adresse correcte de la chaîne dans l'exécutable final.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn