相关疑难解决方法(0)

将Yesod部署到Heroku,无法静态构建

我是Yesod的新手,我无法静态构建Yesod,因此我可以部署到Heroku.

我更改了默认的.cabal文件以反映静态编译

if flag(production)
   cpp-options:   -DPRODUCTION
   ghc-options:   -Wall -threaded -O2 -static -optl-static
else
   ghc-options:   -Wall -threaded -O0
Run Code Online (Sandbox Code Playgroud)

它不再构建.我得到了一大堆警告,然后是一大堆未定义的引用,如下所示:

Linking dist/build/personal-website/personal-website ...
/usr/lib/ghc-7.0.3/libHSrts_thr.a(Linker.thr_o): In function
`internal_dlopen':
Linker.c:(.text+0x407): warning: Using 'dlopen' in statically linked
applications requires at runtime the shared libraries from the glibc
version used for linking
/usr/lib/ghc-7.0.3/unix-2.4.2.0/libHSunix-2.4.2.0.a(HsUnix.o): In
function `__hsunix_getpwent':
HsUnix.c:(.text+0xa1): warning: Using 'getpwent' in statically linked
applications requires at runtime the shared libraries from the glibc
version used for linking
/usr/lib/ghc-7.0.3/unix-2.4.2.0/libHSunix-2.4.2.0.a(HsUnix.o): In
function `__hsunix_getpwnam_r':
HsUnix.c:(.text+0xb1): warning: Using 'getpwnam_r' in …
Run Code Online (Sandbox Code Playgroud)

linux haskell heroku static-linking yesod

27
推荐指数
2
解决办法
3万
查看次数

预测2.6.16和2.6.26内核版本之间的"内核太旧"错误

我使用内核2.6.26-2-amd64在运行Linux(Debian)的机器上构建应用程序,我想在运行Linux(Suse)的另一台机器上运行此应用程序,内核为2.6.16.60-0.21-smp,但是我收到错误"致命:内核太旧".

我从互联网上的研究中得知,这可能发生在针对未编译为支持旧内核版本的glibc库构建时,但它通常涉及2.4版本.是否有可能为同一系列的内核(2.6)获取此类错误,或者这可能来自其他内容?

另外我读到这个问题的解决方案是使用适当的--enable-kernel = VERSION选项编译的另一个版本的glibc重建应用程序.作为替代方案,您可以动态地将您的应用程序与glibc链接以解决问题吗?

谢谢您的帮助.

更新:我理解我的问题可能看似含糊不清或已经提到的解决方案之一(动态链接,建立在另一个[虚拟]系统上,重建glibc [考虑到我读到的关于它的评论看起来相当棘手])但是我是什么最终寻找是预防此类问题的方法.

例如,是否有可能找到哪些版本的Linux内核与特定版本的glibc兼容?

更新2:我最终找到了glibc的源补丁(对于Debian,但我猜其他发行版有类似的在线文档)(我猜)包含我正在寻找的信息.

从这个页面:

--- eglibc-2.11.2.orig/debian/sysdeps/linux.mk
+++ eglibc-2.11.2/debian/sysdeps/linux.mk
@@ -0,0 +1,51 @@
[...]
+MIN_KERNEL_SUPPORTED := 2.6.18
[...]
+# Minimum Kernel supported
+with_headers = --with-headers=$(shell pwd)/debian/include
--enable-kernel=$(call xx,MIN_KERNEL_SUPPORTED)
[...]
Run Code Online (Sandbox Code Playgroud)

这解释了"内核太老"的错误.希望它能帮助其他人.

c++ linux linux-kernel

16
推荐指数
1
解决办法
1万
查看次数

如何链接到其他libc文件?

我想提供共享库以及我的程序,而不是由于版本差异而使用目标系统.

ldd 说我的程序使用这些共享库:

linux-gate.so.1 =>  (0xf7ef0000)**(made by kernel)**  
libc.so.6 => /lib32/libc.so.6 (0xf7d88000)**(libc-2.7.so)**  
/lib/ld-linux.so.2 (0xf7ef1000)**(ld-2.7.so)**
Run Code Online (Sandbox Code Playgroud)

我通过编译成功链接了ld-xxx.so:

gcc -std=c99 -D_POSIX_C_SOURCE=200112L -O2 -m32 -s -Wl,-dynamic-linker,ld-2.7.so myprogram.c
Run Code Online (Sandbox Code Playgroud)

但我没有成功的链接libc-xxx.so.我怎样才能做到这一点 ?

c linker gcc libc ld

9
推荐指数
2
解决办法
1万
查看次数

标签 统计

linux ×2

c ×1

c++ ×1

gcc ×1

haskell ×1

heroku ×1

ld ×1

libc ×1

linker ×1

linux-kernel ×1

static-linking ×1

yesod ×1