Создание статической версии Python?

Я пытался задать этот вопрос в StackOverflow, но мертвая тишина, которая следовала, заставила меня задаться вопросом, могли ли некоторые более определенные для Ubuntu экспертные знания требоваться.

Я пытаюсь создать статическую версию Python таким образом:

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

Однако выполнение make настроенный как выше в конечном счете блюет некоторые предупреждения и ошибка:

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

Я застреваю. Это, кажется, просит, чтобы я перекомпилировал libc. Я думал -static-libgcc был бы достаточно, но по-видимому это не. Я не знаю, существует ли что-то не так с libc тем, чтобы быть связанным или если существует что-то не так с моими флагами компиляции. Это мешает продолжаться. Кто-либо знает то, что продолжается здесь, и как достигнуть моей цели создания статического Python на Ubuntu 11.04?

7
задан 23 May 2017 в 15:39

2 ответа

Для того, чтобы просто построить двоичный файл python, после вашего шага (ошибка выше) вы можете вручную запустить

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

, разница - -Xlinker -export-dynamic удаляется.

Но я не тестировал этот двоичный файл для реального использования (просто запустил его, и он запустился).

0
ответ дан 23 May 2017 в 15:39

Ну, если вы хотите использовать реальную статическую сборку, вам придется использовать другую библиотеку Си.

Glibc не справится с задачей, если вы хотите статически связать, вы должны выследить * .a версии всего, что вам может понадобиться во время выполнения, и поместить их во все [ 114] в приложение. Если среда изменится, ваше приложение сломается. Обычно динамические библиотеки позаботятся об этом, поэтому они предпочтительны.

Насколько я знаю, для вас нет решения.

0
ответ дан 23 May 2017 в 15:39

Другие вопросы по тегам:

Похожие вопросы: