web-dev-qa-db-fra.com

Construire une version statique de Python?

J'ai essayé en posant cette question à StackOverflow, mais le silence de mort qui a suivi m'a fait me demander si une expertise plus spécifique à Ubuntu pourrait être nécessaire.

J'essaie de construire une version statique de Python ainsi:

./configure --disable-shared LDFLAGS="-static -static-libgcc" CPPFLAGS="-static"

Cependant, exécuter make configuré comme ci-dessus finit par bloquer certains avertissements et une erreur:

gcc -pthread -static -static-libgcc -Xlinker -export-dynamic -o python \
            Modules/python.o \
            libpython2.7.a -lpthread -ldl  -lutil   -lm  
<SNIP>
libpython2.7.a(posixmodule.o): In function `posix_initgroups':
Python-2.7.2/./Modules/posixmodule.c:3981: warning: Using 'initgroups' in
statically linked applications requires at runtime the shared
libraries from the glibc version used for linking

/usr/bin/ld: dynamic STT_GNU_IFUNC symbol `strcmp' with pointer equality in
`/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/../../../libc.a(strcmp.o)'
can not be used when making an executable;
recompile with -fPIE and relink with -pie

collect2: ld returned 1 exit status

Je suis coincé. Il semble me demander de recompiler libc. Je pensais que -static-libgcc suffirait, mais apparemment ce n’est pas le cas. Je ne sais pas s'il y a quelque chose qui ne va pas avec la libc étant liée ou s'il y a quelque chose qui ne va pas dans mes drapeaux de compilation. Cela rend difficile de procéder. Est-ce que quelqu'un sait ce qui se passe ici et comment atteindre mon objectif de créer un pythonstatique sur Ubuntu 11.04?

6
Adoring Gumdrop

Pour construire simplement le binaire python, après votre étape (erreur ci-dessus), vous pouvez exécuter manuellement

gcc -pthread -static -static-libgcc  -o python Modules/python.o libpython3.2m.a -lpthread -ldl  -lutil   -lm

la différence est -Xlinker -export-dynamic en cours de suppression.

Mais je n'ai pas testé ce binaire pour une utilisation réelle (juste lancé et exécuté).

5
sio4

Si vous voulez utiliser une construction statique réelle, vous devrez utiliser une bibliothèque C différente.

Glibc ne fera pas l'affaire pour vous, si vous voulez créer un lien statique, vous devez rechercher les versions * .a de tout dont vous pourriez avoir besoin pendant l'exécution et les mettre tout = dans l'application. Si l'environnement change, votre application sera interrompue. Normalement, les bibliothèques dynamiques s’occupent de cela, elles sont donc préférées.

Il n'y a pas de solution pour vous autant que je sache.

0
Bruno Pereira