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 關注
- 140 瀏覽
添加回答
舉報