为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我交叉编译的 CGO 二进制文件不能在 上运行?

为什么我交叉编译的 CGO 二进制文件不能在 上运行?

Go
qq_笑_17 2021-09-13 16:09:39
当我编译以下代码片段时(playground link):package main/*#cgo LDFLAGS: -lbluetooth#include <bluetooth/bluetooth.h>#include <bluetooth/hci.h>#include <bluetooth/hci_lib.h>*/import "C"func main() {        C.hci_get_route(nil)}...使用这些环境变量:CC=arm-linux-gnueabihf-gccCGO_ENABLED=1GOARCH=armGOARM=6我得到一个 1.6Mb 的二进制文件:适用于我的 ODROID-C1(ARMv7,运行 Arch,来自 archlinuxarm.org),但是不适用于我的 Raspberry Pi B+(ARMv6,运行 Raspbian,来自 raspberrypi.org)。当我在 Pi 上运行它时,我得到一个“ Segmentation fault”。当我使用这些环境变量运行它时:LD_PRELOAD=/lib/arm-linux-gnueabihf/libSegFault.soSEGFAULT_USE_ALTSTACK=1删除/usr/lib/arm-linux-gnueabihf/libcofi_rpi.sofrom/etc/ld.so.preload给了我相同的输出,除了没有包含libcofi_rpi.so.试图构建一个静态链接的二进制文件-tags netgo -a -ldflags "-linkmode external -extldflags -static"给了我一个“ Illegal instruction”而不是“ Segmentation fault”。尝试在 Pi 本身上构建二进制文件是可行的,但是,我想交叉编译它。交叉编译确实有效,但仅适用于 ODROID-C1/Arch,不适用于 Raspberry Pi/Raspbian。我使用的确切构建步骤可以使用 Docker 重现:$ docker run -it golang:1.4.1-cross bash在 docker 中,我运行:echo "deb http://emdebian.org/tools/debian/ jessie main" >/etc/apt/sources.list.d/crosstools.listcurl -s http://emdebian.org/tools/debian/emdebian-toolchain-archive.key | apt-key add -dpkg --add-architecture armhfapt-get updateapt-get install -y crossbuild-essential-armhf libbluetooth-dev:armhfexport CC=arm-linux-gnueabihf-gccexport CGO_ENABLED=1export GOARCH=armexport GOARM=6go build -o test test.go这给了我一个名为“test”的可执行文件,如上所述,它不会在 Pi 上运行。
查看完整描述

1 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

所以让我回答我自己的问题,经过数周的反复试验,得出的结论是……

……这根本行不通。

作为最后的手段,我尝试采用与编译上述代码时使用的 Raspbian 映像完全相同的 Raspbian 映像,并使用QEMU运行它。猜猜看:我遇到了段错误。相同的指令,使用相同的图像,当我在 Pi 上运行它时,给我一个工作可执行文件,当我模拟 Pi 或尝试以任何方式交叉编译它时,给我一个段错误。

最后,这不值得麻烦。我们只是设置了专用的 Pi 来构建我们的项目,而“生产”Pi 只是拉取更新后的二进制文件。


查看完整回答
反对 回复 2021-09-13
  • 1 回答
  • 0 关注
  • 219 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信