美文网首页
golang特殊编译

golang特殊编译

作者: hewolf | 来源:发表于2020-10-25 22:56 被阅读0次

兼容不同平台的跨平台编译

说明:因为go的log/sys_log库只能在unix系统编译通过,所以用这个日志库作为跨平台编译对象

标签tags编译

主文件main.go,linux标签文件log_tag_lx.go, windows标签文件log_tag_wx.go
说明: 由于标签放在同一个文件编译不通过,所以分开成不同文件
内容如下:

  • main.go
package main

func main() {
       TagLog()
}
  • log_tag_lx.go
// +build linux

package main

import (
    "log/syslog"
)

func TagLog() {
    sysLog, err := syslog.Dial("", "", syslog.LOG_ERR, "Saturday")
    if err != nil {
        log.Fatal(err)
    }

    sysLog.Emerg("it is tag linux")
}
  • log_tag_wx.go
// +build windows

package main

import "log"

func TagLog() {
    log.Print("it is tag windows")
}

尝试在win10下build,结果如下:

D:\project\gotests>go build -tags windows

D:\project\gotests>go build -tags linux
# runtime/internal/sys
C:\Go\src\runtime\internal\sys\zgoos_windows.go:7:7: GOOS redeclared in this block

windows build并运行成功,使用-tags linux build失败,同理在linux环境下正相反

文件后缀编译

不使用tags编译,可以使用适应平台的后缀文件编译,不同平台用不同后缀,编译的时候编译器自动根据平台选择不同的编译文件编译

主文件main.go, linux后缀文件log_linux.go, windows后缀文件log_windows.go

  • main.go
package main

func main() {
       SuffixLog()
}
  • log_linux.go
package main

import (
    "log/syslog"
)

func SuffixLog() {
    sysLog, err := syslog.Dial("", "", syslog.LOG_ERR, "Saturday")
    if err != nil {
        log.Fatal(err)
    }

    sysLog.Emerg("it is suffix linux")
}
  • log_windows.go
package main

import "log"

func SuffixLog() {
    log.Print("it is suffix windows")
}

win10环境下编译并输出如下

D:\project\gotests>go build

D:\project\gotests>gotests.exe
2020/11/01 21:47:13 it is suffix windows

说明编译器能正确能识别不同平台文件并编译成功,同理linux环境也能成功

二进制文件混淆保护

默认情况下go编译出的程序在运行出错时会输出自己在哪个线程哪个文件哪个函数哪行出的错,就像这样

v2-e1c65afe08fce554273bb34ab9f7cf53_720w.png

DWARF信息对于小黑客们可是如获至宝,这些关键信息不能留下。而且去掉这些东西也非常简单:

go build -ldflags "-s -w” [<your/package]

(需要Go版本大于1.7)
这里的 -ldflags 参数最终会在 go tool link 的时候传给它, go tool link -h解释如下

  -s    disable symbol table
  -w    disable DWARF generation

删除掉调试符号的另一个好处就是,显著减小了文件大小(平均20%)

相关文章

  • golang特殊编译

    兼容不同平台的跨平台编译 说明:因为go的log/sys_log库只能在unix系统编译通过,所以用这个日志库作为...

  • Golang 交叉编译

    [TOC] 说明 本文交叉编译需要 1.5 以上 Golang Mac 下编译 windows 64 Golang...

  • golang进行交叉编译

    golang进行交叉编译 交叉编译即编译不同操作系统平台的可执行程序 golang执行交叉编译,只需要使用两个变量...

  • go如何进行交叉编译

    golang交叉编译 问题 golang如何在一个平台编译另外一个平台可以执行的文件。比如在mac上编译Windo...

  • Golang 隐藏技能 -- 编译指令

    类似C++中的 #pragma pack(2),Golang中也有一些编译指令。它们的实现方式是一些特殊的注释。 ...

  • go 语言学习

    Golang 在 Mac、Linux、Windows 下如何交叉编译 Mac 下编译 Linux 和 Window...

  • Golang在Mac OS上的环境配置

    Golang是Google开发的一种编译型,平行化,具有垃圾回收功能的编译语言,还和C一样有指针。Golang是天...

  • Golang聚合

    教程 Go Web 编程Go语言圣经(中文版) Tips Golang 学习笔记——交叉编译 & 部署Golang...

  • fabric如何定制chaincode运行container

    以golang语言chaincode为例子,当前golang chaincode是编译成一个叫chaincode的...

  • 如何在 Golang 中使用 MQTT

    Golang[https://golang.org/] 是 Google 开发的一种静态强类型、编译型、并发型,并...

网友评论

      本文标题:golang特殊编译

      本文链接:https://www.haomeiwen.com/subject/pfhomktx.html