【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文件是一个标准的调试格式,在许多编程语言和操作系统中都有广泛的应用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
mingw-w64是一个开源的GNU编译器集合,它提供了在Windows平台上编译和运行C和C++程序所需的工具。而Golang(也称为Go)是一种开源的编程语言,最初由Google开发,现在由Go的开发者社区继续维护。 在mingw-w64环境下进行Golang的交叉编译,主要是为了在Windows平台上生成能够在其他操作系统运行的可执行文件。这可以帮助开发者更方便地在Windows上进行跨平台的开发和测试。 为了使用mingw-w64进行Golang交叉编译,我们可以按照以下步骤进行操作: 1. 首先,我们需要在Windows上安装mingw-w64工具链。可以去mingw-w64项目的官方网站下载,选择适合自己操作系统的版本,并按照指示进行安装。 2. 安装完成后,需要配置一些环境变量。将mingw-w64的bin目录添加到系统的PATH变量中,以便在命令行中可以直接访问编译器。 3. 在命令行中,进入到需要进行交叉编译Golang项目所在的目录。 4. 执行以下命令进行交叉编译: ``` GOOS=target GOARCH=arch CGO_ENABLED=1 CC=mingw-w64-gcc go build -o output.exe ``` 其中,target是目标操作系统(例如windows、linux、darwin等),arch是目标处理器架构(例如amd64、386等)。 5. 执行完以上命令后,将生成一个名为output.exe的可执行文件,该文件即为交叉编译生成的可在目标操作系统上运行的文件。 通过以上步骤,我们可以在mingw-w64环境下使用Golang进行交叉编译,生成适用于其他操作系统的可执行文件。这样,开发者可以更方便地进行跨平台的开发和部署。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小镇学者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值