我试过问这个问题在 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 是否有问题,或者我的编译标志是否有问题。这让事情很难继续下去。有人知道这里发生了什么,以及如何实现我在 Ubuntu 11.04 上构建静态 python 的目标吗?
答案1
为了构建python
二进制文件,在您的步骤(上述错误)之后,您可以手动运行
gcc -pthread -static -static-libgcc -o python Modules/python.o libpython3.2m.a -lpthread -ldl -lutil -lm
差异正在-Xlinker -export-dynamic
被消除。
但是我没有测试该二进制文件的实际用途(只是运行它并且它可以运行)。
答案2
好吧,如果您想使用真正的静态构建,您将必须使用不同的 C 库。
Glibc 不会帮你解决这个问题,如果你想要静态链接,你必须找到 *.a 版本的一切你可能在运行时需要它们全部进入应用程序。如果环境发生变化,您的应用程序将会中断。通常动态库会处理这个问题,因此它们是首选。
据我所知,没有适合您的解决方案。