Criando uma versão estática do Python?

6

Eu tentei fazer esta pergunta no StackOverflow, mas o silêncio que se seguiu me fez pensar se algum conhecimento específico do Ubuntu poderia ser necessário.

Eu estou tentando construir uma versão estática do Python:

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

No entanto, a execução de make configurado como acima acaba por criar alguns avisos e um erro:

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

Estou preso. Parece estar me pedindo para recompilar a libc. Eu pensei que -static-libgcc seria o suficiente, mas aparentemente não é. Eu não sei se há algo errado com a libc sendo vinculada ou se há algo errado com meus sinalizadores de compilação. Isso dificulta continuar. Alguém sabe o que está acontecendo aqui e como alcançar meu objetivo de construir um python estático no Ubuntu 11.04?

    
por Adoring Gumdrop 30.09.2011 / 13:02

2 respostas

5

Para criar apenas o python binário, após sua etapa (acima do erro), você pode executar manualmente

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

a diferença é -Xlinker -export-dynamic sendo removida.

Mas eu não testei esse binário para uso real (apenas o executei e ele é executado).

    
por sio4 28.09.2012 / 13:45
0

Bem, se você quiser usar uma construção estática real, precisará usar uma biblioteca C diferente.

A Glibc não fará o truque para você, se você quiser linkar estaticamente você deve procurar as * .a verions de tudo que você pode precisar durante o tempo de execução e colocá-las all no aplicativo. Se o ambiente mudar você, o aplicativo será interrompido. Bibliotecas normalmente dinâmicas cuidarão disso, então elas são preferidas.

Não há solução para você, tanto quanto eu sei.

    
por Bruno Pereira 30.09.2011 / 14:19