我不知道Yesod是什么,但我 确切 知道您其他每个错误的含义。
首先,你应该 不 尝试静态链接。您得到的警告是完全正确的: 如果 您静态链接并使用要获得警告的例程之一,则必须安排在与libc.so.6版本
完全相同 的系统上运行您在构建时使用过。
与普遍的看法相反,静态链接在Linux上生成的是 更少 但不是更多的可移植可执行文件。
您的其他(静态)链接错误是由于
libopenssl.a链接时丢失而引起的。
但是,让我们假设您将走“明智的”路线,并使用动态链接。
对于动态链接,Linux(和大多数其他UNIX)支持向后兼容:旧的二进制文件继续在较新的系统上运行。但是它们不支持前向兼容性(在较新的系统上构建的二进制文件通常
不会 在较旧的系统上运行)。
但这就是您要尝试的:您在具有glibc-2.14(或更高版本)的系统上构建,并且在具有glibc-2.13(或更高版本)的系统上运行。
你需要知道的另一件事是,glibc的是由一些200+二进制文件必须全部匹配的 准确 。两个关键的二进制文件
/lib/ld-linux.so和
/lib/libc.so.6(但还有更多:
libpthread.so.0,
libnsl.so.1,等等)。如果其中一些二进制文件来自不同版本的glibc,则通常会崩溃。这就是您尝试将glibc-2.14
libc.so.6放在
LD_LIBRARY_PATH-它不再与系统匹配时所得到的
/lib/ld-linux。
那么有什么解决方案呢?有几种可能性(难度越来越大):
- 您可以将
ld-2.14.so
(/lib/ld-linux
符号链接的目标)复制到目标系统,并显式调用它:/path/to/ld-2.14.so --library-path <whatever> /path/to/your/executable
这通常可以正常工作,但会混淆看着的应用程序
argv[0],并中断那些自己重新执行的应用程序。
您可以在较旧的系统上构建。
你可以使用
appgcc
(这个选项已经消失了,看到这为它曾经被描述)。您可以设置与目标系统匹配的chroot环境,并在该chroot中进行构建。
您可以构建自己的Linux到旧版Linux交叉编译器



