如何将Go程序打包成自我支持的形式?

6

我有一个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

在交换机上运行 ulimit -a 命令,查看虚拟内存、最大内存或数据段是否有任何限制。 - nos
1个回答

22

TL;DR

你的Go应用程序无法分配虚拟内存以运行。如果它正在运行Linux或Unix变体,则检查组/用户权限和ulimit值以检查该用户是否有任何限制。也许这个问题可能会有所帮助。

更长的版本

所以,你在这里的问题不是Go不能在没有Go开发环境的情况下运行,因为你真的不需要它。Go以生成静态二进制文件而闻名,根据定义是自包含的,不依赖于其他库来运行。

如果你仔细看一下错误消息,你会注意到它说:

"cannot reserve arena virtual address space"

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

快速查看malloc的源代码给我们一个提示:

设置分配竞技场,一个连续的内存区域,在那里分配的数据将被找到。竞技场以足够大的位图开始,每个分配的字都有4个位。

如果你查看源代码,你会在这里找到错误信息。

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

你可以在这里找到Linux实现的代码。

由于Go通常会尽量避免大的分配,因为它们可能会立即失败,如果用户无法分配64K大小的东西,这意味着用户有严格的限制。由于我不知道你的交换机运行的是哪个操作系统,也没有开发经验,所以我不能再深入了解了。

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


1
好好挖掘,有趣的情况。 - twotwotwo
@dallarosa 非常详细!谢谢 :) 以下是设置的值: ulimit = 无限制ulimit -v = 395067我正在为思科的NXOS平台开发。如果有更多信息,将非常有帮助! - Rahul
写下那个数字并将虚拟内存设置为无限。 - DallaRosa
但是395 MB应该足够运行一个简单的“Hello world”程序,对吧? - Rahul
@Rahul 我正在研究进程内存的分配方式以及可能会干扰你的进程的因素。这可能需要一些时间,但我在有更多信息时会更新这个答案! - DallaRosa

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