web-dev-qa-db-fra.com

Pourquoi gcc ne fournit-il pas implicitement l'indicateur -fPIC lors de la compilation de bibliothèques statiques sur x86_64

J'ai eu de nombreux problèmes lors de la compilation d'objets partagés qui se lient statiquement à des bibliothèques statiques. Ce problème n'apparaît que sur les plates-formes x84_64. Lorsque je fais le même travail de compilation sur x86_32, je n'ai aucun problème.

C'est peut-être une configuration de GCC spécifique au système d'exploitation, mais mes recherches indiquent que son fonctionnement de GCC sur les plates-formes x86_64. Quoi qu'il en soit, j'utilise gcc 4.4.3 sur Ubuntu 10.04 x86_64.

Comment le problème est-il résolu? ... Assurez-vous que toutes les dépendances des bibliothèques statiques sont compilées avec -fPIC.

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

Question 2: Mon hypothèse est que lorsque vous établissez une liaison avec du code statique, vous câblez les fonctions dans votre binaire au moment de la liaison, pourquoi a-t-il besoin du niveau d'indirection fourni par la machine "code indépendant de la position" ?

Question 3: Maintenant, si x86 n'a pas besoin de -fpic/-fPIC pour lier des objets partagés à des archives statiques, pourquoi est-ce nécessaire dans x86_64?

Question 4: même si cela est nécessaire, pourquoi n'est-il pas fourni implicitement? Je pensais que casser les changements était censé être un gros non

61
Hassan Syed
  1. Voir question 544035 . Également discuté ici et .
  2. Cela dépend de l'utilisation que vous aurez pour votre bibliothèque statique. Si vous souhaitez uniquement le lier à des programmes, il n'a pas besoin de code PIC (libtool appelle cela une bibliothèque de commodité, car vous pourriez à peu près vous en passer, cela aide simplement à obtenir votre processus de compilation à une taille raisonnable, par exemple). Sinon, si vous avez l'intention de lier des bibliothèques partagées à celui-ci, vous avez besoin de code PIC dans votre bibliothèque statique.
  3. Voir question 146744 et aussi ici
  4. Il gonfle votre code, ce n'est donc pas la valeur par défaut. Une chose à voir est que, lorsque vous compilez un seul fichier objet, GCC ne sait pas si vous allez en créer une bibliothèque partagée ou non. Dans la plupart de mes petits projets, je relie simplement quelques fichiers objets et je n'ai pas besoin de code PIC, par exemple.

De plus, mon conseil serait: si vous avez besoin de vous en soucier, vous le faites mal (ou vous aimez apprendre à la dure, ce qui est agréable parce que vous tirerez le meilleur parti de l'expérience). Les systèmes de compilation (libtool, cmake, quoi que vous utilisiez) devraient le faire pour vous.

47
F'x