linux – 如何打包Go程序以使其自给自足?

前端之家收集整理的这篇文章主要介绍了linux – 如何打包Go程序以使其自给自足?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有一个Go程序,我想在交换机上运行它.由于我无法在交换机上安装Go,我只是复制可执行文件并尝试运行.但是我收到以下错误.@H_404_2@

@H_404_2@

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可执行文件与其所有依赖项打包在一起?@H_404_2@

编辑1:这是ulimit -a转储.@H_404_2@

@H_404_2@

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@H_404_2@

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

更长的版本@H_404_2@

所以,你的问题不是没有go开发环境就能运行,因为你真的不需要它. Go因生成静态二进制文件而闻名,根据定义,这些二进制文件是自包含的,并且不依赖于其他库来运行.@H_404_2@

如果您更好地查看错误消息,您会注意到它说:@H_404_2@

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

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

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

@H_404_2@

Set up the allocation arena,a contiguous area of memory where
allocated data will be found. The arena begins with a bitmap large
enough to hold 4 bits per allocated word.@H_404_2@

如果您浏览该源代码,您将找到错误消息around here.@H_404_2@

运行时·SysReserve C函数是实际尝试为竞技场保留虚拟地址空间的函数.如果它不能分配它,它将抛出该错误.@H_404_2@

您可以找到它的Linux实现的代码here.@H_404_2@

正如通常试图避免大的分配,因为可能会立即失败,如果您的用户不能分配小到64K的东西,这意味着您的用户有严格的限制.由于我不知道您的交换机正在运行哪个操作系统并且没有为它们开发的经验,因此我不能再进一步了解.@H_404_2@

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

猜你在找的Linux相关文章