タグ: golang

LEDE-Project Buildrootの$(ARCH)とGolang

確認した結果。調べられなかった / 調べていないARCHは無し。

SoC/CPU (ENDIAN) BuildRoot $(ARCH) GOARCH LEDE targets (e.g.)
mips32 LITTLE mipsel mipsle ramips
BIG mips mips ar71xx
mips64 BIG mips64 mips64 ?
arm32 LITTLE arm arm bcm53xx
x86 LITTLE i386 386
  • x86/Generic
  • x86/Legacy
  • x86/AMD Geode
x86_64 LITTLE x86_64 amd64 x86/x86_64
広告

GoプログラムとOpenWrt/LEDE-ProjectとMIPS

若干コケたのでメモ。
GoのプログラムをMIPS SoC搭載デバイスのOpenWrt/LEDE-Project向けにビルドする場合、Endian (Endianness)に注意する必要がある。
mackerel-agentをLinux/MIPS32環境で動かしてみた – Qiita
上記ページでは、サーバ管理のMackerelを利用するのに必要なmackerel-agentをOpenWrt/LEDE用にビルドしている。
記事中で対象となっているデバイスは正確な機種名が述べられていないものの、掲載されている画像を見るにBUFFALOの有線機で、SoCはQualcomm Atheros (ar71xx) 辺りと思われる。

ar71xxはEndian (Endianness)(あまりその辺詳しくないので各自調べて)がBIGであり、記事中にあるコンパイル方法でビルドした場合BIG Endianに対応したバイナリが生成される。

この時生成されたバイナリは、fileコマンドで確認してもMIPSとかその辺の情報しかないためMediaTek MT7621などでもそのまま動きそう、というのが今回コケた場所。

実際にはNGで、MT7621ほかRalink/MediaTek MIPSのSoCはLITTLE Endianであり、BIG Endian向けにコンパイルされたプログラムは動作しない。実機(Planex VR500(MT7621))で吐かれたエラーが以下。

root@LEDE:/tmp$ ./mackerel-agent
./mackerel-agent: line 1: syntax error: unexpected "("

LITTLE EndianなSoCに対応するバイナリを生成させるには、GOARCHに “mipsle” を指定する。

GOOS=linux GOARCH=mipsle GOMIPS=softfloat make build

以上でVR500等で動作するバイナリが生成される。

参考: platforms – OpenWrt