Loading... ## 0x00 Golang可以在一个平台交叉编译多个平台的程序,但是在默认情况下Golang中编译C语言的`CGO`不支持交叉编译。 通过查询资料和阅读官方文档了解到`CGO`默认使用本地计算机自带的`gcc`和`g++`编译器,所以可以修改默认的编译器使用自己准备的编译器来进行交叉编译。 这里演示的是使用CGO在Linux下编译Windows程序 我在这里环境是WSL/Kali (Windows是最好的Linux发行版(滑稽)) 我之所以选择WSL是因为Linux的包相对Windows好管理,而且windows下有一些软件都是linux的移植版比如`gcc`编译器等,并且WSL的开销比传统虚拟机要小。 ## 0x01 安装 首先在安装Linux编译Windows的交叉编译器`mingw-w64` ```shell sudo apt install mingw-w64 ``` 这句命令主要安装了: - 32位windows编译器`i686-w64-mingw32-gcc`和`i686-w64-mingw32-g++` - 64位windows编译器`x86_64-w64-mingw32-gcc`和`x86_64-w64-mingw32-g++` ### 单独安装 ```shell 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 使用 进行编译时配置环境变量 ```shell 编译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位编译 ```shell #!/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位编译 ```shell #!/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 $* ``` 将代码保存文件,编译时在要进行编译的源码目录直接执行这个文件,例如: ```shell 例如文件保存路径为/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 其他架构的编译器 ```shell 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 © Allow specification reprint Support Appreciate the author AliPayWeChat Like 0 如果觉得我的文章对你有用,请随意赞赏