67 votes

Pourquoi gcc ne fournit-il pas implicitement le drapeau -fPIC lors de la compilation des bibliothèques statiques sur x86_64

J'ai eu de nombreux problèmes de compilation d'objets partagés qui relient de manière statique à l'encontre des bibliothèques statiques. Ce problème ne s'affiche que sur x84_64 plates-formes. Lorsque l'on fait la même compilation de travail sur x86_32 je n'ai pas de problèmes.

C'est peut-être un OS spécifique GCC configuration chose, mais ma recherche indique que sa façon de GCC travaille sur x86_64 plates-formes. De toute façon, je suis en utilisant gcc 4.4.3 sur Ubuntu 10.04 x86_64.

Comment est résolu le problème ?... S'assurer que tous les bibliothèque statique dépendances sont compilé avec-fPIC.

Question 1: Quelle est la différence entre le fpic et -fPIC (apparemment -fPIC génère plus d'instructions x86) ? Pourquoi le type ultérieure plus pertinente dans le x86_64 contexte ?

Question 2: Mon hypothèse est que, lorsque vous vous connectez à l'encontre de code statique vous êtes le câblage de l'fonctions dans votre binaire au moment de la liaison, pourquoi est-il besoin de le niveau d'indirection la "position indépendante code" machines offre ?

Question 3: Maintenant, si x86 n'a pas besoin d'-fpic / -fPIC pour lier des objets partagés contre l'électricité statique archives pourquoi est-il nécessaire dans x86_64 ?

Question 4: même si elle est nécessaire, pourquoi n'est-il pas fourni implicitement ? Je pensais que les modifications importantes qui était censé être un gros no-no

60voto

F'x Points 6557
  1. Voir la question 3544035. Également discuté ici et .
  2. Cela dépend de l'usage que vous en aurez pour votre bibliothèque statique. Si vous voulez seulement un lien dans les programmes, il n'a pas besoin de PIC de code (libtool appels que la commodité de la bibliothèque, parce que vous pouvez très bien faire sans, il permet simplement d'obtenir votre processus de compilation d'une taille raisonnable, par exemple). Sinon, si vous avez l'intention de lier les bibliothèques partagées à l'encontre de cela, vous avez besoin de PIC de code dans votre bibliothèque statique.
  3. Voir la question 3146744 et aussi ici
  4. Il gonfle votre code, il n'est donc pas la valeur par défaut. Une chose à voir, c'est que, lorsque vous compilez un seul fichier objet, GCC ne sais pas si vous allez créer une bibliothèque partagée ou non. Dans la plupart de mes petits projets, j'ai simplement relier un couple de fichiers de l'objet, et ne pas besoin de PIC de code, par exemple.

Aussi, mon conseil serait: si vous avez besoin de s'inquiéter à ce sujet, vous le faites mal (ou vous souhaitez apprendre à la dure, ce qui est agréable parce que vous aurez plus de l'expérience). Compilation des systèmes (libtool, cmake, tout ce que vous utilisez) devrait le faire pour vous.

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