在受限环境中运行Haskell程序需要什么?

4
我希望能够在我自己构建的受限环境中运行一个简单的Haskell程序。以下是我想要运行的Haskell程序:
import System.IO

main = do
    hPutStrLn stderr "test standard error!"
    hPutStrLn stdout "test standard out!"

这段代码只是将一个字符串输出到stderr和stdout,如果没有被监控的话在范围外可以很好地运行。代码编译如下:

ghc -O2 --make -static -optc-static -optl-static $MAINHS -optl-pthread -o bin/run_ai

我得到了一个run_ai可执行文件,正如我所说,这在监狱外运行良好。下面是放置在监狱环境中的内容,我认为这里缺少了一些东西,因为当我在监狱中运行程序时,它什么也不做,甚至没有退出,并且没有给出任何错误/输出信息。

mkdir -p lib64 lib bin

cp /bin/sh bin/

# Binaries
cp /lib64/ld-linux-x86-64.so.2 lib64/

cp /lib/x86_64-linux-gnu/libpthread.so.0 lib/
cp /lib/x86_64-linux-gnu/libc.so.6 lib/
cp /lib/x86_64-linux-gnu/libdl.so.2 lib/
cp /lib/x86_64-linux-gnu/librt.so.1 lib/
cp /lib/x86_64-linux-gnu/libm.so.6 lib/
cp /lib/x86_64-linux-gnu/libtinfo.so.5 lib/
cp /lib/x86_64-linux-gnu/libutil.so.1 lib/
cp /usr/lib/x86_64-linux-gnu/libffi.so.6 lib/
cp /usr/lib/x86_64-linux-gnu/libgmp.so.10 lib/
cp /usr/lib/libgmp.so.3 lib/

我知道监狱本身很好用,因为我已经成功地将其用于十几种其他编程语言,但Haskell让我头痛,因为我完全不知道可能出了什么问题。不幸的是,我不是Haskell的专家,但我只需要它编译并在监狱内运行。我是否缺少实际运行可执行的Haskell文件所需的内容?

所以我的问题是:我缺少/做错了什么?


在二进制文件ghc上运行ldd是否能为您提供任何提示,表明您是否缺少.so文件? - Squidly
6
strace下在监狱之外运行程序,观察它打开了哪些文件。 - n. m.
1
也许对您并不合适,但注意到使用 PureIO,您可以在 Haskell 语言内部“监禁”一个 main 函数。 - leftaroundabout
6
strace太棒了,我不知道它的存在,但它解决了我的问题。显然Haskell使用/usr/lib/locale/locale-archive来运行,所以我添加了这个路径,程序现在可以正常工作了。 - AIJim
1个回答

3

在离开监狱之外,运行

strace -e open yourprogram

这将打印你的程序打开的所有文件的名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接