要在64位Linux环境下编译出32位程序,需要使用交叉编译。下面是步骤:
环境准备
- 安装gcc和golang的32位开发库:
$ sudo apt install gcc-multilib
$ sudo apt install libc6-dev-i386
- 下载并安装32位的 Golang(假设你的
GOPATH
为$HOME/go
):
$ cd ~
$ wget https://dl.google.com/go/go1.12.7.linux-386.tar.gz
$ sudo tar -xzf go1.12.7.linux-386.tar.gz -C /usr/local/
$ export PATH=$PATH:/usr/local/go/bin
$ export GOPATH=$HOME/go
编译32位程序
- 进入golang项目的目录:
$ cd $GOPATH/src/project
- 设置环境变量:
$ export GOARCH=386
$ export GOOS=linux
- 如果需要,设置交叉编译所需的链接器环境变量:
$ export CC="gcc -m32"
- 编译项目:
$ go build
例子1:编译项目,生成32位可执行文件。
项目路径为 /home/user/project
,可执行文件名称为 test32
,以下是命令示例:
$ cd /home/user/project
$ export GOARCH=386
$ export GOOS=linux
$ go build -o test32
例子2:在64位Linux环境下编译32位的C程序。
在32位环境下编译C程序底层使用的是32位的库,必须先安装32位的库。首先,安装gcc和32位的库文件:
$ sudo apt-get update
$ sudo apt-get install gcc-multilib
$ sudo apt-get install libc6-dev-i386
然后编写32位的C程序:
#include <stdio.h>
int main()
{
printf("Hello, world!\n");
return 0;
}
编译C程序:
$ export CC="gcc -m32"
$ gcc -m32 -o myprog myprog.c
可以 add machine 检查生成的二进制文件
$ file myprog
myprog: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=0x4234b7891d0365da7ca37b6b15c9bb1d70a7e7f5, not stripped
这样就可以在64位Linux环境下编译出32位的C程序了。
显示的机器位数示例,如果你要编译生成的文件运行在另一台机器上,建议检查目标机器CPU类型知道32位还是64位,然后采用相对应的命令进行编译。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:golang 64位linux环境下编译出32位程序操作 - Python技术站