2009-08-09 10 views
14

J'essaye de construire un passage en utilisant llvm et j'ai fini de construire llvm et ses composants associés. Cependant, quand je lance make après avoir suivi toutes les étapes pour construire un laissez-passer, y compris la makefile, je reçois le texte suivantPasser un drapeau gcc à travers makefile

relocalisation R_X86_64_32 contre `un symbole local » ne peut pas être utilisé lors d'un objet partagé; recompiler avec -fPIC

Après avoir essayé de trouver un correctif en recherchant le message d'erreur, j'ai appris que ce n'est pas spécifique à llvm. Quelques solutions ont suggéré que je devrais utiliser "--enable-shared" lors de l'exécution de configure mais cela n'a pas aidé mon cas. Maintenant, je veux reconstruire llvm en utilisant fPIC, comme l'indique l'erreur. Mais comment puis-je faire cela en utilisant le makefile?

+0

double possible de [recompiler avec l'option -fPIC, mais l'option est déjà dans le makefile] (http: // stackoverflow .com/questions/332767/recompiler-avec-fpic-option-mais-l'-option-est-déjà-dans-le-makefile) – senderle

Répondre

11

On dirait que vous pouvez ajouter le -fPIC (pour le code indépendant de la position, quelque chose que vous voulez pour une bibliothèque partagée qui pourrait être chargée à une adresse) en définissant des variables shell:

export CFLAGS="$CFLAGS -fPIC" 
export CXXFLAGS="$CXXFLAGS -fPIC" 

Regarder Makefile.rules, ceux-ci seront ramassés et utilisés. Semble étrange que ce n'était pas là pour commencer.

EDIT:

En fait, la lecture plus dans les Makefile, j'ai trouvé ce lien au LLVM Makefile Guide. De Makefile.rules, en définissant SHARED_LIBRARY = 1 ou LOADABLE_MODULE = 1 (qui implique SHARED_LIBRARY) dans Makefile mettra -fPIC dans les indicateurs du compilateur.

5

Si vous êtes modérément convaincu que vous devez utiliser « -fPIC » partout (ou « -m32 » ou « -m64 », dont j'ai besoin plus souvent), vous pouvez utiliser le « truc »:

CC="gcc -fPIC" ./configure ... 

Cela suppose un shell Bourne/Korn/POSIX/Bash et définit la variable d'environnement CC sur 'gcc -fPIC' avant d'exécuter le script de configuration. Cela (généralement) garantit que toutes les compilations sont effectuées avec les indicateurs spécifiés. Pour définir la «bittiness» correcte de la compilation, cela fonctionne parfois mieux que les divers autres mécanismes que vous trouvez - il est difficile pour une compilation de se débrouiller, sauf en ignorant complètement le fait que vous avez spécifié le compilateur C à utiliser.

1

Une autre option est de passer -fPIC directement à faire de la manière suivante:

make CFLAGS='-fPIC' CXXFLAGS='-fPIC' 
+1

Cela ne fonctionnera pas car il remplace les CFLAGS de Makefile. –

+0

Ça a marché pour moi. L'as tu essayé? – Datageek

+3

Je l'ai essayé :) Votre exemple fonctionne pour les cas simples. Mais quand vous avez un CFLAGS défini dans le makefile, il sera remplacé, en supposant que votre makefile contienne quelque chose comme '$ (CC) $ (CFLAGS)' –

Questions connexes