104 votes

Pourquoi tous les codes compilés ne sont-ils pas indépendants des positions?

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?

75voto

wowest Points 1016

Cela ajoute une indirection. Avec un code indépendant de la position, vous devez charger l’adresse de votre fonction puis y accéder. Normalement, l'adresse de la fonction est déjà présente dans le flux d'instructions.

30voto

Evan Teran Points 42370

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.

29voto

Unknown Points 22789

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.

http://en.wikipedia.org/wiki/Position_independent_code

28voto

Eli Bendersky Points 82298

Cet article explique le fonctionnement du PIC et le compare à l’alternative - relocalisation au temps de chargement . Je pense que cela concerne votre question.

1voto

smcameron Points 1864

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X