1 回答
TA贡献1865条经验 获得超7个赞
根据Go源码,它似乎是在链接时设置Subsystem
的OptionalHeader
。
因此,您可以使用debug/pe来获取它。
it is windows GUI
以下代码将在使用 编译时打印go build -ldflags "-H windowsgui"
,否则打印it is windows CUI
。
请注意,os.Executable()
可能会返回符号链接的路径,因此可能不可靠。
package main
import (
"debug/pe"
"fmt"
"os"
)
// these constants are copied from https://github.com/golang/go/blob/6219b48e11f36329de801f62f18448bb4b1cd1a5/src/cmd/link/internal/ld/pe.go#L92-L93
const (
IMAGE_SUBSYSTEM_WINDOWS_GUI = 2
IMAGE_SUBSYSTEM_WINDOWS_CUI = 3
)
func main() {
fileName, err := os.Executable()
if err != nil {
panic(err)
}
fl, err := pe.Open(fileName)
if err != nil {
panic(err) // maybe not windows binary, or unreadable for some reasons
}
defer fl.Close()
var subsystem uint16
if header, ok := fl.OptionalHeader.(*pe.OptionalHeader64); ok {
subsystem = header.Subsystem
} else if header, ok := fl.OptionalHeader.(*pe.OptionalHeader32); ok {
subsystem = header.Subsystem
}
if subsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI {
fmt.Println("it is windows GUI")
} else if subsystem == IMAGE_SUBSYSTEM_WINDOWS_CUI {
fmt.Println("it is windows CUI")
} else {
fmt.Println("binary type unknown")
}
}
- 1 回答
- 0 关注
- 105 浏览
添加回答
举报