Lors de la compilation de bibliothèques partagées dans gcc, l'option -fPIC compile le code indépendamment de la position. Existe-t-il une raison (performance ou autre) pour laquelle vous ne compileriez pas tout code indépendant de la position du code?
Réponses
Trop de publicités?En plus de la accepté de répondre. Une chose qui fait mal PIC code de la performance beaucoup est le manque de "IP l'adressage relatif" sur x86. Avec "IP l'adressage relatif," vous pourriez demander pour les données X octets à partir du pointeur d'instruction en cours. Cela ferait PIC code beaucoup plus simple.
Les sauts et les appels sont généralement EIP relative, de sorte que ceux-ci ne sont pas vraiment poser un problème. Cependant, l'accès à des données va nécessiter un peu plus de la ruse. Parfois, un registre sera temporairement réservées comme une "base" pointeur de données que l'exige le code. Par exemple, une technique courante est de l'abus de la façon dont les appels à travailler sur x86:
call label_1
.dd 0xdeadbeef
.dd 0xfeedf00d
.dd 0x11223344
label_1:
pop ebp ; now ebp holds the address of the first dataword
; this works because the call pushes the **next**
; instructions address
; real code follows
mov eax, [ebp + 4] ; for example i'm accessing the '0xfeedf00d' in a PIC way
Ceci et d'autres techniques d'ajouter une couche d'indirection pour l'accès de données. Par exemple, le GOT (Global offset table) utilisé par les compilateurs gcc.
x86-64 ajouté un "RIP relative" mode qui rend les choses beaucoup plus simple.
Oui il y a des raisons de performances. Certains accès sont effectivement en vertu d'une autre couche d'indirection pour obtenir la position absolue dans la mémoire.
Il y a aussi le GOT (Global offset table) qui stocke des décalages de variables globales. Pour moi, cela ressemble à un IAT correction de la table, qui est classé comme dépendant de la position par wikipedia et quelques autres sources.
Cet article explique le fonctionnement du PIC et le compare à l’alternative - relocalisation au temps de chargement . Je pense que cela concerne votre question.
De plus, le matériel de mémoire virtuelle de la plupart des processeurs modernes (utilisé par la plupart des systèmes d'exploitation modernes) signifie que beaucoup de code (toutes les applications d'espace utilisateur, à l'exception de l'utilisation insolite de mmap ou similaire) n'a pas besoin d'être indépendant de la position. Chaque programme obtient son propre espace d'adressage qui, à son avis, commence à zéro.