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?
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é).
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.