Golang中Gccgo的"buildid"是什么?

Golang中Gccgo的"buildid"是什么? 我切换到 gccgo,现在收到一个非常可疑的错误信息

go tool: no such tool buildid

构建命令是:

$(GO) install -x server.go …/libgomsgque.a

这是 make 的输出:

/usr/bin/gccgo-8 -fgo-importcfg=/dev/null -c -x c - || true
mkdir -p $WORK/b001/_importcfgroot_
ln -s .../x86_64-suse-linux-gnu/debug/theLink/gomsgque/pkg/gccgo_linux_amd64/libgomsgque.a $WORK/b001/_importcfgroot_/libgomsgque.a
cd .../example/go/src/server
/usr/bin/gccgo-8 -c -g -m64 -fdebug-prefix-map=$WORK=/tmp/go-build -gno-record-gcc-switches -o $WORK/b001/_go_.o -I $WORK/b001/_importcfgroot_ ./main.go
echo '  .section .go.buildid,"e"' >> $WORK/b001/_buildid.s
echo '  .byte 0x48,0x61,0x4b,0x46,0x55,0x4f,0x73,0x5a' >> $WORK/b001/_buildid.s
echo '  .byte 0x37,0x43,0x36,0x30,0x42,0x55,0x39,0x65' >> $WORK/b001/_buildid.s
echo '  .byte 0x48,0x61,0x4b,0x46,0x55,0x4f,0x73,0x5a' >> $WORK/b001/_buildid.s
echo '  .byte 0x37,0x43,0x36,0x30,0x42,0x55,0x39,0x65' >> $WORK/b001/_buildid.s
echo '  .byte 0x48,0x53,0x4d,0x68' >> $WORK/b001/_buildid.s
echo '  .section .note.GNU-stack,"",@progbits' >> $WORK/b001/_buildid.s
echo '  .section .note.GNU-split-stack,"",@progbits' >> $WORK/b001/_buildid.s
echo '' >> $WORK/b001/_buildid.s
/usr/bin/gccgo-8 -xassembler-with-cpp -I $WORK/b001/ -c -o $WORK/b001/_buildid.o -D GOOS_linux -D GOARCH_amd64 -m64 $WORK/b001/_buildid.s
ar rcD $WORK/b001/_pkg_.a $WORK/b001/_go_.o $WORK/b001/_buildid.o
go tool: no such tool "buildid"
make: *** [Makefile:587: server] Fehler 2

这些是我从 Makefile 中获取的 go 变量:

GO = /usr/bin/go-8
GOARCH = gccgo_linux_amd64
GOC = gccgo-8
GOFLAGS = -g -O2
GOROOT = /usr
GO_M = /usr/bin/go-8
USE_GO = yes
ac_ct_GOC = gccgo-8
#GOPATH = $(abs_srcdir):$(abs_builddir)/../../gomsgque
#export GOPATH
GOBIN = $(abs_builddir)
GOMSGQUE = $(abs_builddir)/../../gomsgque/pkg/$(GOARCH)/libgomsgque.a
#export CGO_LDFLAGS = -r '$(abs_builddir)/../../libmsgque/.libs'
GO_COMP = $(GO) install -x
export GOBIN

额外信息,看起来 gobuildid 工具,但 go-8 没有:

>:…/example/go> go tool buildid
usage: go tool buildid [-w] file
  -w    write build ID
>:.../example/go> go-8 tool buildid
go tool: no such tool "buildid"
>:.../example/go> which go
/usr/bin/go
>:.../example/go> which go-8
/usr/bin/go-8

更新

go install 中跳过 -x 选项,它就能工作了。


更多关于Golang中Gccgo的"buildid"是什么?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中Gccgo的"buildid"是什么?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中,buildid是Go工具链中的一个工具,用于读取或写入构建ID(Build ID)。构建ID是嵌入在Go二进制文件中的唯一标识符,用于跟踪构建版本和依赖关系。

对于gccgo,情况有所不同。gccgo是Go语言的GCC前端实现,它使用GCC工具链而不是标准的Go工具链。因此,go tool buildid命令在gccgo环境中不可用,因为gccgo不使用相同的工具集。

从你的错误信息来看,go-8(可能是gccgo的Go包装器)没有buildid工具。这是因为gccgo的构建过程不依赖标准的Go工具链中的buildid工具。相反,gccgo通过汇编文件(如_buildid.s)直接嵌入构建ID,如你的构建输出所示:

echo '  .section .go.buildid,"e"' >> $WORK/b001/_buildid.s
echo '  .byte 0x48,0x61,0x4b,0x46,0x55,0x4f,0x73,0x5a' >> $WORK/b001/_buildid.s
...

这些汇编指令将构建ID直接写入目标文件。因此,当使用gccgo时,go tool buildid命令是不必要的,因为构建ID已经通过GCC工具链处理。

在你的Makefile中,GO_COMP = $(GO) install -x使用了-x标志,这会打印执行命令的详细信息。但问题可能在于go install -x试图调用buildid工具,而gccgo环境中不存在该工具。移除-x标志后构建成功,因为-x可能触发了某些内部检查或步骤,这些步骤在gccgo中不适用。

如果你需要在gccgo中处理构建ID,可以通过检查生成的二进制文件来验证构建ID是否已嵌入。例如,使用objdumpreadelf工具:

objdump -s -j .go.buildid your_binary

或者,如果你需要以编程方式读取构建ID,可以编写一个简单的Go程序来解析二进制文件中的.go.buildid部分。以下是一个示例代码:

package main

import (
    "debug/elf"
    "fmt"
    "log"
)

func main() {
    f, err := elf.Open("your_binary")
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()

    section := f.Section(".go.buildid")
    if section == nil {
        log.Fatal("no .go.buildid section found")
    }

    data, err := section.Data()
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("Build ID: %s\n", string(data))
}

这段代码使用debug/elf包来读取ELF二进制文件(适用于Linux)中的.go.buildid部分。对于其他平台(如Windows或macOS),可能需要使用不同的方法。

总之,buildid工具在gccgo中不可用,因为gccgo使用GCC工具链处理构建ID。移除-x标志可以避免触发对buildid工具的调用,从而解决构建错误。如果你需要操作构建ID,请直接通过二进制文件或使用平台特定的工具来处理。

回到顶部