Go Wiki:InvalidFlag
invalid flag in #cgo CFLAGS
此页面描述了诸如 invalid flag in #cgo CFLAGS
之类的构建错误的背景以及如何解决这些错误。
CVE-2018-6574 描述了 go 工具中潜在的安全漏洞:运行 go get
会从互联网下载并构建 Go 代码,使用 cgo 的 Go 代码可以指定要传递给编译器选项,因此谨慎使用 -fplugin
可能会导致 go get
执行任意代码。虽然很难阻止编译器可能受到攻击的所有可能方式,但我们选择阻止显而易见的方式。
如 问题 23672 中所述,这是通过使用安全列表来完成的,该列表列出了在 go get
、go build
及其朋友中允许的编译器/链接器选项。当 cgo 代码尝试传递不在安全列表中的选项时,go 工具将报告错误 invalid flag in #cgo CFLAGS
(或 #cgo LDFLAGS
、pkg-config --cflags
、pkg-config --ldflags
等)。
此安全列表在 1.8.7、1.9.4 和 1.10 及所有后续版本中都是新的。
我该怎么办?
如果这种情况发生在您身上,并且该选项是良性的,您应该做两件事
- 将环境变量
CGO_CFLAGS_ALLOW
(或CGO_LDFLAGS_ALLOW
、CGO_CXXFLAGS_ALLOW
等)设置为与该选项匹配的 regexp。 - 提交错误,要求将该选项添加到安全列表中。请务必包括完整的错误消息,如果可能,还包括您正在构建的代码的描述。
为什么不使用不安全的列表?
因为如果编译器添加了一些新的不安全选项,所有现有的 Go 版本都会立即变得容易受到攻击。
为什么不获取编译器选项的完整列表并将其全部列入安全列表?
因为有数百个选项,并且没有明确的方法可以获取完整列表。许多编译器和链接器选项都依赖于目标,因此只会在特定平台或特定配置中报告。已知文档不完整。
此内容是 Go Wiki 的一部分。