微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我正在尝试在 32 位 mips cpu 上使用 gopacket 库将一个小应用程序编译到 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,这很好,因为我的目标系统没有额外的空间来安装在其上编译任何东西所需的所有工具。我知道 libpcap 在 Windows 上不存在 1 对 1 版本,所以这可能解释了“defs”文件。但我通常希望它与我的 linux 系统上的 API 具有相同的 API。

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

CGO_ENABLED=1

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

dpkg --add-architecture mips

并将 debian repo 添加到 /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 运行 go build 时,它总是选择 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

我希望这可以帮助其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。