openeuler-riscv / oerv-team

OERV 实习生工作中心
11 stars 43 forks source link

修复 alertmanager #278

Open misaka00251 opened 8 months ago

misaka00251 commented 8 months ago

软件包信息

软件包名称: alertmanager

openEuler 仓库地址: https://gitee.com/src-openeuler/alertmanager

构建仓库地址: https://build.tarsier-infra.isrc.ac.cn/package/show/openEuler:24.03:Epol/alertmanager

说明

问题背景: 编译失败,需要更新 vendor.tar.gz 内的 rv 相关支持

所需技能:

其它:

iGxnon commented 8 months ago

FYI: https://github.com/golang/go/issues/62465

似乎是一个 go 1.21 的一个 backport issue,1.20 可以正常编译,用了 @randall77 的一句魔法咒语:-gcflags=all=-d=wrapglobalmapctl=1 后,本地可以通过 osc build 了。

image

似乎这个问题也没有完全修复好:https://github.com/golang/go/issues/62465#issuecomment-1936338270

是否可以这样修复? alertmanager.spec:

40c40
< export GOFLAGS="-mod=vendor -buildmode=pie"
---
> export GOFLAGS="-mod=vendor -buildmode=pie -gcflags=all=-d=wrapglobalmapctl=1"
misaka00251 commented 8 months ago

@iGxnon Sure, if you want to do this I'll assign you. Please submit your PRs to src-openeuler.

iGxnon commented 8 months ago

https://gitee.com/src-openeuler/alertmanager/pulls/22

Jingwiw commented 8 months ago

需要分析这个修改有破坏性影响吗

iGxnon commented 8 months ago

需要分析这个修改有破坏性影响吗

不好说,-gcflags=all=-d=wrapglobalmapctl=1 中的 wrapglobalmapctl 是个 debug 参数:https://github.com/golang/go/blob/c2c4a32f9e57ac9f7102deeba8273bcd2b205d3c/src/cmd/compile/internal/base/debug.go#L67 应该还是最好不要打开,关于这个参数几乎没有可以查阅的文档,不清楚有啥后果。

官方的 workaround: https://go-review.googlesource.com/c/go/+/520095

找到了另外一个 workaround:https://github.com/felixonmars/archriscv-packages/pull/2957 , 想法来自 https://github.com/golang/go/issues/62465#issuecomment-1714211786 注释掉了 IsDirectCall(),从源头掐掉了问题( 根据

This workaround skips the check which would disable the deadcode optimization (in some cases).

我猜测这个修改的后果可能会导致编译的时间变长,更多 case 会尝试 deadcode optimization

Jingwiw commented 8 months ago

作为临时解决方案,你给 openeuler 的 pr 里面应该通过架构宏把修改隔离掉。这个是 easywork 追踪后面的原因,并且解决 golang 对 riscv支持的缺陷,这个是 hardwork,可以选择接

Jingwiw commented 8 months ago

export GOFLAGS="-mod=vendor -buildmode=pie -gcflags=all=-d=wrapglobalmapctl=1"

export GOFLAGS="-mod=vendor -buildmode=pie \ %ifarch riscv64 -gcflags=all=-d=wrapglobalmapctl=1 \ %endif " @iGxnon

iGxnon commented 8 months ago

export GOFLAGS="-mod=vendor -buildmode=pie -gcflags=all=-d=wrapglobalmapctl=1"

export GOFLAGS="-mod=vendor -buildmode=pie %ifarch riscv64 -gcflags=all=-d=wrapglobalmapctl=1 %endif " @iGxnon

感谢,已经处理完毕

iGxnon commented 8 months ago

追踪后面的原因,并且解决 golang 对 riscv支持的缺陷,这个是 hardwork,可以选择接

我想试试,可以在看板里另开一条 issue 么?