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

StackOverflow https://stackoverflow.com/questions/3961446

Question

J'ai eu de nombreux problèmes en compilant des objets partagés qui relient de manière statique aux bibliothèques statiques. Ce problème montre que sur les plates-formes x84_64. Quand vous faites le même travail de compilation sur x86_32 Je n'ai pas de problèmes.

Peut-être est une chose de configuration de GCC spécifique du système d'exploitation, mais ma recherche indique que son comment fonctionne 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 est le problème résolu? ... Se assurer que toutes les dépendances de la bibliothèque statique sont compilés avec -fPIC.

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

Question 2: Je suppose que lorsque vous liez contre le code statique que vous êtes dur câblage des fonctions dans votre binaire au moment de lien, pourquoi at-il besoin du niveau d'indirection la « position de code indépendant "machines fournit?

Question 3: Maintenant, si x86 n'a pas besoin -fpic / -fPIC objets partagés lien contre les archives statiques pourquoi est-il nécessaire dans x86_64?

Question 4: , même si elle est nécessaire pourquoi pas fourni implicitement? Je pensais que des changements était censé la rupture d'un gros no-no

Était-ce utile?

La solution

  1. Voir question 3544035 . Aussi discuté et il .
  2. Cela dépend de ce que vous utilisez aura pour votre bibliothèque statique. Si vous ne voulez lier dans les programmes, il n'a pas besoin de code PIC (appels libtool qu'une bibliothèque de commodité, parce que vous pouvez faire à peu près sans elle, il aide simplement obtenir votre processus de compilation à une taille raisonnable, par exemple). Dans le cas contraire, si vous avez l'intention de lier les bibliothèques partagées contre, vous avez besoin du code PIC dans votre bibliothèque statique.
  3. Voir question 3146744 aussi ici
  4. Il gonflerait votre code, il est donc pas la valeur par défaut. Une chose à voir est que, lorsque vous compilez un seul fichier d'objet, GCC ne sait pas si vous allez créer une bibliothèque partagée sur de celui-ci ou non. Dans la plupart de mes petits projets, je relie simplement ensemble deux fichiers objet, et ne pas besoin de code PIC, par exemple.

En outre, mon conseil serait: si vous devez vous inquiétez pas à ce sujet, vous le faites mal (ou vous apprendre à la dure, ce qui est bien parce que vous aurez plus de l'expérience). systèmes de compilation (libtool, CMake, tout ce que vous utilisez) devraient le faire pour vous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top