构建一个静态版本的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是否有问题,还是我的编译标志有问题。这使得继续进行变得困难。有人知道这里发生了什么,以及如何在Ubuntu 11.04上构建静态Python吗?
2个回答

为了仅构建Python二进制文件,在您的步骤(上述错误之后),您可以手动运行。
gcc -pthread -static -static-libgcc  -o python Modules/python.o libpython3.2m.a -lpthread -ldl  -lutil   -lm

区别在于删除了-Xlinker -export-dynamic。但我没有进行实际使用的测试(只是运行它并且它可以运行)。

如果你想使用真正的静态构建,你将需要使用不同的C库。
Glibc对你来说行不通,如果你想要静态链接,你必须找到所有可能在运行时需要的*.a版本的所有内容,并将它们全部放入应用程序中。如果环境发生变化,你的应用程序将会崩溃。通常情况下,动态库会处理这个问题,所以它们更受欢迎。
据我所知,目前没有解决方案适合你。

你能解释一下“真正的静态构建”是什么意思吗?我看到其他人已经构建了Python的静态版本,所以我倾向于相信这是可行的。 - Adoring Gumdrop
那你应该使用帖子上提供的选项:http://bytes.com/topic/python/answers/23235-build-static-python-executable-linux#post85962,我觉得这太麻烦了,而且根据你想要的东西来看,这样做会非常繁琐,以至于在正常情况下无法完成。只是说一下,如果你想继续,我无法对那些帖子上的评论做出任何增加或删除的意见。 - Bruno Pereira
那个帖子上有人成功编译了一个静态的Python。我发这个问题是因为同样的步骤对我来说似乎不起作用。 - Adoring Gumdrop
在我看来,加载initgroups需要加载glibc的其他部分,也许这就是你的问题所在。它可能适用于其他构建,但对你的构建不起作用。你为什么要构建这个静态版本呢? - Bruno Pereira
即使我将导致“在静态链接应用程序中使用'foo'...”警告的所有模块注释掉,我仍然遇到链接器错误。而且我想构建静态环境,以便在将来将项目移植到iOS时获得类似的环境,并且我还想更好地理解这个问题。 - Adoring Gumdrop
对此问题我已经努力搜索了一下,但是找不到一个好的答案。你可以尝试把这个问题发布到这个网址,也许如果你在更专门的主题组里提问,会更快地得到一个满意的回答。祝你好运,希望能够解决这个问题。 - Bruno Pereira
感谢你的努力。我已经在stackoverflow上发布了这个问题,应该足够了。过一段时间后我会在那里设置悬赏。 - Adoring Gumdrop
好的,祝你好运,希望你能找到答案 ;) - Bruno Pereira