0x00

Golang可以在一个平台交叉编译多个平台的程序,但是在默认情况下Golang中编译C语言的CGO不支持交叉编译。
通过查询资料和阅读官方文档了解到CGO默认使用本地计算机自带的gccg++编译器,所以可以修改默认的编译器使用自己准备的编译器来进行交叉编译。

这里演示的是使用CGO在Linux下编译Windows程序
我在这里环境是WSL/Kali (Windows是最好的Linux发行版(滑稽))
我之所以选择WSL是因为Linux的包相对Windows好管理,而且windows下有一些软件都是linux的移植版比如gcc编译器等,并且WSL的开销比传统虚拟机要小。

0x01 安装

首先在安装Linux编译Windows的交叉编译器mingw-w64

sudo apt install mingw-w64

这句命令主要安装了:

  • 32位windows编译器i686-w64-mingw32-gcci686-w64-mingw32-g++
  • 64位windows编译器x86_64-w64-mingw32-gccx86_64-w64-mingw32-g++

单独安装

sudo apt install gcc-mingw-w64-x86-64-win32 g++-mingw-w64-x86-64-win32

sudo apt install gcc-mingw-w64-i686-win32 g++-mingw-w64-i686-win32

0x02 使用

进行编译时配置环境变量

编译64位windows程序
export GOOS=windows
export GOARCH=amd64
export CC=x86_64-w64-mingw32-gcc
export CXX=x86_64-w64-mingw32-g++
export CGO_ENABLED=1

编译32位windows程序
export GOOS=windows
export GOARCH=386
export CC=i686-w64-mingw32-gcc
export CXX=i686-w64-mingw32-g++
export CGO_ENABLED=1

最后使用go build等命令进行编译

0x03 实用脚本

64位编译

#!/bin/bash
export GOOS=windows
export GOARCH=amd64
export CC=x86_64-w64-mingw32-gcc
export CXX=x86_64-w64-mingw32-g++
export CGO_ENABLED=1
cd $(pwd)
go build $*

32位编译

#!/bin/bash
export GOOS=windows
export GOARCH=386
export CC=i686-w64-mingw32-gcc
export CXX=i686-w64-mingw32-g++
export CGO_ENABLED=1
cd $(pwd)
go build $*

将代码保存文件,编译时在要进行编译的源码目录直接执行这个文件,例如:

例如文件保存路径为/bin/cgo-w64-x86_64

在进行编译的目录下执行

$ /bin/cgo-w64-x86_64
等同于
$ go build

$ /bin/cgo-w64-x86_64 -ldflags="-X pkg.variable1=value -X pkg.variable2=value"
等同于
$ go build -ldflags="-X pkg.variable1=value -X pkg.variable2=value"
其他以此类推

0x04 其他架构的编译器

gccgo-aarch64-linux-gnu

gccgo-alpha-linux-gnu

gccgo-arm-linux-gnueabi

gccgo-arm-linux-gnueabihf

gccgo-i686-linux-gnu

gccgo-multilib-i686-linux-gnu

gccgo-multilib-powerpc-linux-gnu

gccgo-multilib-powerpc64-linux-gnu

gccgo-multilib-s390x-linux-gnu

gccgo-multilib-sparc64-linux-gnu

gccgo-multilib-x86-64-linux-gnux32

gccgo-powerpc-linux-gnu

gccgo-powerpc64-linux-gnu

gccgo-powerpc64le-linux-gnu

gccgo-riscv64-linux-gnu

gccgo-s390x-linux-gnu

gccgo-sparc64-linux-gnu

gccgo-x86-64-linux-gnux32
Last modification:April 12, 2020
如果觉得我的文章对你有用,请随意赞赏