Linux 如何打包围棋程序,使其能够自给自足?

Linux 如何打包围棋程序,使其能够自给自足?,linux,go,cisco,Linux,Go,Cisco,我有一个Go程序,我想在交换机上运行它。因为我不能在交换机上安装Go,所以我只是复制可执行文件并尝试运行。但是我得到了以下错误 runtime: panic before malloc heap initialized fatal error: runtime: cannot reserve arena virtual address space runtime stack: runtime.throw(0x8149b8b) /usr/local/go/src/pkg/runt

我有一个Go程序,我想在交换机上运行它。因为我不能在交换机上安装Go,所以我只是复制可执行文件并尝试运行。但是我得到了以下错误

runtime: panic before malloc heap initialized
fatal error: runtime: cannot reserve arena virtual address space

runtime stack:
runtime.throw(0x8149b8b)
        /usr/local/go/src/pkg/runtime/panic.c:520 +0x71
runtime.mallocinit()
        /usr/local/go/src/pkg/runtime/malloc.goc:552 +0xf2
runtime.schedinit()
        /usr/local/go/src/pkg/runtime/proc.c:150 +0x3a
_rt0_go()
        /usr/local/go/src/pkg/runtime/asm_386.s:95 +0xf6`
如何将Go可执行文件及其所有依赖项打包

编辑1:这里是
ulimit-a
转储

core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 40960
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) 395067
file locks                      (-x) unlimited
TL;DR

您的Go应用程序无法分配虚拟内存以运行。我以前从未为交换机开发过,但如果它运行linux或unix变体,请检查组/用户权限和ulimit值,以检查该用户是否有任何限制。也许会有帮助

较长版本

因此,这里的问题不是没有go开发环境就无法运行go,因为您确实不需要它。Go以生成静态二进制文件而闻名,根据定义,静态二进制文件是自包含的,不依赖于其他库来运行

如果您仔细查看错误消息,您会注意到它说:

“无法保留竞技场虚拟地址空间”

你可能会问自己“这个竞技场是什么?”

我快速浏览一下malloc的源代码,它给了我们一个提示:

设置分配竞技场,一个连续的内存区域 将找到已分配的数据。竞技场以一个大位图开始 足够容纳每个分配字4位

如果您仔细阅读该源代码,就会发现错误消息

runtime·SysReserve C函数实际上是试图为竞技场保留虚拟地址空间的函数。如果它无法分配,它将抛出该错误

您可以找到它的Linux实现代码

由于go通常会尝试避免大的分配,因为可能会立即失败,如果您的用户无法分配64K这样小的资源,这意味着您的用户有严格的限制。因为我不知道你的交换机运行的是哪个操作系统,也没有为它们开发的经验,所以我不能再进一步了


如果您能提供更多信息,我可以尝试相应地更新此答案。

挖掘得好,情况很有趣。@dallarosa,这很详细!谢谢:)以下是我为思科NXOS平台开发的值集:ulimit=unlimited和ulimit-v=395067。任何更多的信息都会很有帮助!记下这个数字,并将虚拟内存设置为无限。但是395 MB应该足以运行一个简单的“Hello world”程序,对吗?@Rahul我正在研究进程内存是如何分配的,以及什么样的事情可能会干扰您的进程。这可能需要一些时间,但我会更新这个答案,当我有更多的信息!在交换机上运行
ulimit-a
,查看虚拟内存、最大内存或数据段是否有任何限制