【Golang】使用CGO交叉编译
471 字
2 分钟
【Golang】使用CGO交叉编译

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
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++
单独安装
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-win320x02 使用
进行编译时配置环境变量
编译64位windows程序export GOOS=windowsexport GOARCH=amd64export CC=x86_64-w64-mingw32-gccexport CXX=x86_64-w64-mingw32-g++export CGO_ENABLED=1
编译32位windows程序export GOOS=windowsexport GOARCH=386export CC=i686-w64-mingw32-gccexport CXX=i686-w64-mingw32-g++export CGO_ENABLED=1最后使用go build等命令进行编译
0x03 实用脚本
64位编译
#!/bin/bashexport GOOS=windowsexport GOARCH=amd64export CC=x86_64-w64-mingw32-gccexport CXX=x86_64-w64-mingw32-g++export CGO_ENABLED=1cd $(pwd)go build $*32位编译
#!/bin/bashexport GOOS=windowsexport GOARCH=386export CC=i686-w64-mingw32-gccexport CXX=i686-w64-mingw32-g++export CGO_ENABLED=1cd $(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支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
相关文章智能推荐
1
【Golang】GO项目结构
Golang笔记2019-06-25
2
【Golang】命令行传递参数
Golang笔记2018-09-13
3
【Golang】1.18泛型初步理解
Golang笔记2022-04-18
4
【Golang】关于time包的一些记录
Golang笔记2022-01-04
5
【Golang】调用syscall调用windows dll弹窗
Golang笔记2022-09-22
随机文章随机推荐















加载更多…