这篇文章上次修改于 246 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

目前stackplz的一个需求是,针对arm进程能够正常解析syscall参数

不同于一般情况下go程序的跨平台构建,这里并不是要编译arm架构的stackplz,而是能将数据解析为arm架构下的结构体

也就是说目的是编译两个arm64版本,但是一个是用于解析arm64的系统调用参数,一个是arm的

最开始准备用两个分支来实现,但是这样做还是太不优雅了,于是决定采用build tags来做编译


具体来说是下面这样:

user/argtype/argtype_complex.go 这个文件中用到了Arg_Utsname这个结构体

user/argtype/config_struct_arm.go 这个文件使用了build tags,具体代码片段如下

//go:build armtarget
// +build armtarget

package argtype

type Arg_Utsname struct {
    Index uint8
    Len   uint64
    util.Utsname
}

user/argtype/config_struct_arm64.go 这个文件使用了build tags,具体代码片段如下

//go:build !armtarget
// +build !armtarget

package argtype

type Arg_Utsname struct {
    Index uint8
    Len   uint32
    util.Utsname
}

但是编译的时候却提示说找不到Arg_Utsname这个定义,经过一通测试和分析,发现可能是这样的

Makefile中设置了GOARCH=arm64,但是设置-tags armtarget的时候,本来config_struct_arm.go应该生效,但是与GOARCH这个对不上,所以就被排除了

所以解决方法就是把config_struct_arm.go改个名字

也就是说build tags应该避免用arm等架构的名称,文件名自然也要避免