【Golang】go 编译命令 ldflags -w -s的作用和问题

macos交叉编译到linux
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags “-w -s” test.go

go build 是 go 语言中用于将源代码编译成可执行文件或库的命令。而 go build 命令支持一些可选参数,其中包括 -ldflags 参数。

-ldflags 参数可以用来向编译器传递额外的参数。其中,-w 和 -s 是两个常用的参数。

-w:去掉 dwarf 调试信息。会减小可执行文件的大小。
-s:去掉符号表信息。会进一步减小可执行文件的大小。
因此,使用 -ldflags “-w -s” 参数可以同时去掉 dwarf 调试信息和符号表信息,从而进一步减小可执行文件的大小。这对于一些需要尽可能减小体积的场景比较有用,比如在 docker 镜像中部署应用程序等。

但是,需要注意的是,在去掉调试信息和符号表信息后,如果出现了异常(如 panic),会导致调试变得困难。因此,在开发调试阶段不建议使用 -w 和 -s 参数。

-ldflags 是 Go 编译器的一个选项,可以为链接器(linker)添加标志(flags)。其中 -w 和 -s 分别表示忽略符号表和忽略调试信息。

具体来说,-w 选项告诉链接器忽略符号表信息,这可以减少可执行文件的大小,但也意味着无法在运行时对可执行文件进行动态调试。而 -s 选项则告诉链接器忽略调试信息,同样可以减少可执行文件的大小,但也会导致一些调试功能不可用。

使用 -ldflags 选项可以让我们更灵活地控制可执行文件的大小和调试功能,但需要根据具体情况选择合适的标志。

需要注意的是,使用 -w 和 -s 标志可能会影响你的程序的可维护性,因为调试信息和符号表信息对于诊断问题和进行性能调优非常有用。所以,在生产环境之外,我们不建议使用这些标志。

为什么go程序去掉了DWAFR信息也能找到函数对应的源文件和行号?

Go 语言对 DWARF 调试信息的使用是非常灵活的,可以在编译时将 DWARF 调试信息嵌入到程序中,也可以在运行时通过解析 Go 语言的二进制文件格式,从符号表中获取函数名、文件名和行号等信息。
在 Go 语言的二进制文件格式中,每个函数都被嵌入了一些元信息,包括函数的名称返回值和参数类型、函数的入口地址以及文件和行号等调试相关信息。这些信息可以从Go 二进制文件中读取,而不需要使用 DWARF 调试信息。

什么是go语言中的dwarf

在Go语言中,DWARF(Debugging With Arbitrary Record Format)是一种调试信息的格式。它包含了程序的符号表、源代码行号、变量名以及类型信息等,这些信息可以在程序调试时提供有用的帮助。DWARF文件通常与可执行文件一起生成,以便在需要时进行调试。Go语言的编译器会自动生成DWARF文件,以便在调试时提供必要的信息。DWARF文件是一个标准的调试格式,在许多编程语言和操作系统中都有广泛的应用。

你可能感兴趣的:(golang,linux,开发语言)