當(dāng)我編譯以下代碼片段時(shí)(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)}...使用這些環(huán)境變量:CC=arm-linux-gnueabihf-gccCGO_ENABLED=1GOARCH=armGOARM=6我得到一個(gè) 1.6Mb 的二進(jìn)制文件:適用于我的 ODROID-C1(ARMv7,運(yùn)行 Arch,來(lái)自 archlinuxarm.org),但是不適用于我的 Raspberry Pi B+(ARMv6,運(yùn)行 Raspbian,來(lái)自 raspberrypi.org)。當(dāng)我在 Pi 上運(yùn)行它時(shí),我得到一個(gè)“ Segmentation fault”。當(dāng)我使用這些環(huán)境變量運(yùn)行它時(shí):LD_PRELOAD=/lib/arm-linux-gnueabihf/libSegFault.soSEGFAULT_USE_ALTSTACK=1刪除/usr/lib/arm-linux-gnueabihf/libcofi_rpi.sofrom/etc/ld.so.preload給了我相同的輸出,除了沒(méi)有包含libcofi_rpi.so.試圖構(gòu)建一個(gè)靜態(tài)鏈接的二進(jìn)制文件-tags netgo -a -ldflags "-linkmode external -extldflags -static"給了我一個(gè)“ Illegal instruction”而不是“ Segmentation fault”。嘗試在 Pi 本身上構(gòu)建二進(jìn)制文件是可行的,但是,我想交叉編譯它。交叉編譯確實(shí)有效,但僅適用于 ODROID-C1/Arch,不適用于 Raspberry Pi/Raspbian。我使用的確切構(gòu)建步驟可以使用 Docker 重現(xiàn):$ docker run -it golang:1.4.1-cross bash在 docker 中,我運(yùn)行: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這給了我一個(gè)名為“test”的可執(zhí)行文件,如上所述,它不會(huì)在 Pi 上運(yùn)行。
1 回答

慕田峪4524236
TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超5個(gè)贊
所以讓我回答我自己的問(wèn)題,經(jīng)過(guò)數(shù)周的反復(fù)試驗(yàn),得出的結(jié)論是……
……這根本行不通。
作為最后的手段,我嘗試采用與編譯上述代碼時(shí)使用的 Raspbian 映像完全相同的 Raspbian 映像,并使用QEMU運(yùn)行它。猜猜看:我遇到了段錯(cuò)誤。相同的指令,使用相同的圖像,當(dāng)我在 Pi 上運(yùn)行它時(shí),給我一個(gè)工作可執(zhí)行文件,當(dāng)我模擬 Pi 或嘗試以任何方式交叉編譯它時(shí),給我一個(gè)段錯(cuò)誤。
最后,這不值得麻煩。我們只是設(shè)置了專(zhuān)用的 Pi 來(lái)構(gòu)建我們的項(xiàng)目,而“生產(chǎn)”P(pán)i 只是拉取更新后的二進(jìn)制文件。
- 1 回答
- 0 關(guān)注
- 254 瀏覽
添加回答
舉報(bào)
0/150
提交
取消