为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
杨__羊羊 2021-09-09 21:09:46
我有一个 Go 程序,我想在交换机上运行它。由于我无法在交换机上安装 Go,我只是复制可执行文件并尝试运行。但我收到以下错误。runtime: panic before malloc heap initializedfatal error: runtime: cannot reserve arena virtual address spaceruntime stack:runtime.throw(0x8149b8b)        /usr/local/go/src/pkg/runtime/panic.c:520 +0x71runtime.mallocinit()        /usr/local/go/src/pkg/runtime/malloc.goc:552 +0xf2runtime.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) unlimiteddata seg size           (kbytes, -d) unlimitedscheduling priority             (-e) 0file size               (blocks, -f) unlimitedpending signals                 (-i) 40960max locked memory       (kbytes, -l) 32max memory size         (kbytes, -m) unlimitedopen files                      (-n) 1024pipe size            (512 bytes, -p) 8POSIX message queues     (bytes, -q) 819200real-time priority              (-r) 0stack size              (kbytes, -s) 8192cpu time               (seconds, -t) unlimitedmax user processes              (-u) 1024virtual memory          (kbytes, -v) 395067file locks                      (-x) unlimited
查看完整描述

1 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

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

更长的版本

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

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

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

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

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

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

如果您查看该源代码,您会在此处找到错误消息。

runtime·SysReserve C 函数实际上是尝试为arena 保留虚拟地址空间的函数。如果它不能分配那个,它会抛出那个错误。

您可以在此处找到它的 Linux 实现代码。

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

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


查看完整回答
反对 回复 2021-09-09
  • 1 回答
  • 0 关注
  • 174 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信