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 getgo build 及其朋友中允许的编译器/链接器选项。当 cgo 代码尝试传递不在安全列表中的选项时,go 工具将报告错误 invalid flag in #cgo CFLAGS(或 #cgo LDFLAGSpkg-config --cflagspkg-config --ldflags 等)。

此安全列表在 1.8.7、1.9.4 和 1.10 及所有后续版本中都是新的。

我该怎么办?

如果这种情况发生在您身上,并且该选项是良性的,您应该做两件事

  1. 将环境变量 CGO_CFLAGS_ALLOW(或 CGO_LDFLAGS_ALLOWCGO_CXXFLAGS_ALLOW 等)设置为与该选项匹配的 regexp
  2. 提交错误,要求将该选项添加到安全列表中。请务必包括完整的错误消息,如果可能,还包括您正在构建的代码的描述。

为什么不使用不安全的列表?

因为如果编译器添加了一些新的不安全选项,所有现有的 Go 版本都会立即变得容易受到攻击。

为什么不获取编译器选项的完整列表并将其全部列入安全列表?

因为有数百个选项,并且没有明确的方法可以获取完整列表。许多编译器和链接器选项都依赖于目标,因此只会在特定平台或特定配置中报告。已知文档不完整。


此内容是 Go Wiki 的一部分。