如何使用 gopacket 为 32 位 mips 编译 Go 应用程序

How to compile a Go application using gopacket for 32bit mips

我正在尝试使用 gopacket 库在 32 位 mips cpu 上将一个小应用程序编译为 linux。不幸的是,我遇到了很多这样的错误:

/home/cdutz/go/pkg/mod/github.com/google/gopacket@v1.1.19/pcap/pcap.go:30:22: undefined: pcapErrorNotActivated

在“正常”linux 系统上,这些似乎是在“pcap_unix.go”中定义的,而在 windows 上,这些值来自“defs_windows_amd64.go”。我的目标系统上确实有 32 位 mips 版本的 libpcap,这很好,因为我的目标系统没有额外的 space 来安装编译任何东西所需的所有工具。我知道 libpcap 在 windows 上不作为一对一版本存在,所以这可能解释了“defs”文件。但我通常希望它与我的 linux 系统上的 API 相同。

[更新] 因此,似乎需要确保的第一件事是执行 cgo。这是通过设置环境变量来完成的:

CGO_ENABLED=1

接下来我们需要确保安装了 libpcap 的 mips 兼容版本(头文件在任何体系结构上都是相同的)。为了在我的 Ubuntu 16.4 上执行此操作,我首先需要启用 'mips' 架构:

dpkg --add-architecture mips

并将 debian 仓库添加到 /etc/apt/sources.list

deb [trusted=yes] http://ftp.de.debian.org/debian buster main

一旦完成,我就可以安装 mips 二进制文件了:

apt install libpcap-dev:mips libpcap0.8-dev:mips libc6-dev:mips libdbus-1-dev:mips libpcap0.8:mips

为了交叉编译,我似乎需要一个可以做到这一点的gccgo版本。为此,我安装了:

apt-get install gccgo-mips-linux-gnu

现在出现了一些我不确定我做对了的事情,但是当 运行 使用 compiler=gccgo 进行构建时,它总是选择 amd64 版本并使用除 'gccgo' 之外的任何其他版本,因为编译器参数没有不起作用,所以我更新了 /usr/bin/gccgo 中的符号链接以指向:'mips-linux-gnu-gccgo-8'(在同一目录中)。

完成所有这些更改后,我几乎可以使用此命令构建所有内容:

go build -compiler=gccgo

如果我使用“-x”选项启用附加输出,我可以看到 cgo 现在正在做这件事。它还在编译所有其他模块。但是在 pcap 上它现在失败了:

cc1: error: command line option '-c' is valid for the driver but not for C

这就是我目前所处的位置。

好的,3 天后我想我已经成功了,我将总结我所做的事情。

最后 gccgo 路径是死胡同,所以我没有安装 gccgo-mips-linux-gnu 我安装了 gcc-mips-linux-gnu.

接下来我将 CC 环境变量设置为指向此:

 export CC=/usr/bin/mips-linux-gnu-gcc-8

这实际上是缺少的东西。

所以在我的 Ubuntu 16.04 系统上总结一下:

dpkg --add-architecture mips
echo "deb [trusted=yes] http://ftp.de.debian.org/debian buster main" > /etc/apt/sources.list
apt update
apt install -y wget git build-essential mc
apt install -y gcc-mips-linux-gnu
apt install -y libpcap-dev:mips libpcap0.8-dev:mips libc6-dev:mips libdbus-1-dev:mips libpcap0.8:mips

export CC=/usr/bin/mips-linux-gnu-gcc-8
export GOOS=linux
export GOARCH=mips   
export GOMIPS=softfloat
export CGO_ENABLED=1

go build

希望这对其他人有帮助。