首页 > 系统相关 >golang语言下,在x86的linux平台上编译arm64二进制

golang语言下,在x86的linux平台上编译arm64二进制

时间:2023-04-16 18:46:21浏览次数:39  
标签:aarch64 sudo golang 编译 base static arm64 linux qemu

转载自:https://www.annhe.net/article-4542.html

==================

 

编译etcd测试工具benchmark:

CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build .

 

 

概述

有很多开源软件并没有提供 arm 安装包或者二进制,或者能通过包管理工具安装但是版本比较旧(比如 Pandoc)。如果想为树莓派编译软件,一个方法是直接在树莓派上编译,另外就是在 x86 平台上借助 qemu-user-static 来构建 armv7l 或者 aarch64 编译环境。使用 qemu-user-static 方法的好处是方便在 CI 里编译,毕竟大部分 CI 服务都是 x86 环境。另外一个好处是能够编译大型的耗内存的软件,树莓派的内存最大只有 8GB,某些软件,比如 Pandoc,可能遇到内存不足的情况。

qemu-user-static

  • 安装:apt install qemu-user-static
  • 下载基础文件系统,比如 arm64 的 Ubuntu:aria2c -x 16 http://cdimage.ubuntu.com/ubuntu-base/releases/19.10/release/ubuntu-base-19.10-base-arm64.tar.gz
  • mkdir rootfs
  • cd rootfs
  • tar xvf ../ubuntu-base-19.10-base-arm64.tar.gz
  • 复制对应版本的 qemu-user-static 到 chroot 环境:cp /usr/bin/qemu-aarch64-static usr/bin
  • 复制 DNS 配置:cp /etc/resolv.conf etc
  • 挂载文件系统
 
1 2 3 4 5         sudo mount -t devtmpfs devtmpfs dev         sudo mount -t devpts devpts dev/pts         sudo mount -t sysfs sysfs sys         sudo mount -t tmpfs tmpfs tmp         sudo mount -t proc proc proc

然后使用 chroot . /bin/bash 就可以 chroot 到这个 aarch64 架构的 Ubuntu 系统了。

持续集成

chroot 的命令格式为:

 
1 chroot [OPTION] NEWROOT [COMMAND [ARG]...]

如果要在持续集成中使用 qemu-user-static , chroot 时的 [COMMAND [ARG]...] 改为要执行的脚本即可,比如将构建过程写在 build.sh 中并复制到 chroot 环境的根目录,然后执行以下代码即可:

 
1 chroot . /build.sh

下面是使用 Github Action 编译 Pandoc aarch64 的一个例子。

 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 name: pandoc-aarch64 on: [push] jobs:     aarch64-pandoc:     runs-on: ubuntu-latest     steps:     - uses: actions/checkout@v2     - name: build       run: |         mkdir rootfs         export pkg=`curl -s "http://hackage.haskell.org/package/pandoc" |grep "base href" |awk -F'"' '{print $2}' |sed 's/\/$//g' |awk -F'/' '{print $NF}'`         curl -s -L "https://github.com/arm4rpi/pandoc-arm/releases/download/v0.1/aarch64-$pkg.tar.gz" -o rootfs/aarch64-$pkg.tar.gz         MIME=`file -b --mime-type rootfs/aarch64-$pkg.tar.gz`         echo $MIME         [ "$MIME"x == "application/gzip"x ] && echo "Already exists" && exit 0 || echo "Not exists"         sudo dd if=/dev/zero of=/mnt/swapfile bs=1M count=12288         sudo dd if=/dev/zero of=/home/swapfile bs=1M count=10240         sudo mkswap /mnt/swapfile         sudo mkswap /home/swapfile         sudo swapon /mnt/swapfile         sudo swapon /home/swapfile         free -m         df -h         sudo apt-get update         sudo apt-get install -y qemu-user-static aria2         aria2c -x 16 http://cdimage.ubuntu.com/ubuntu-base/releases/19.10/release/ubuntu-base-19.10-base-arm64.tar.gz         cd rootfs         echo "decompression rootfs"         tar xvf ../ubuntu-base-19.10-base-arm64.tar.gz &>/dev/null && echo "decompression rootfs successfull"         cp /usr/bin/qemu-aarch64-static usr/bin         cp /etc/resolv.conf etc         cp ../build.sh ${pkg}         cp ../cabal.project* .         sudo mount -t devtmpfs devtmpfs dev         sudo mount -t devpts devpts dev/pts         sudo mount -t sysfs sysfs sys         sudo mount -t tmpfs tmpfs tmp         sudo mount -t proc proc proc         echo "chroot to arm"         sudo chroot . /${pkg}         echo "Upload Asset"         for id in `ls aarch64-*.tar.gz`;do         curl -H "Authorization: token ${{ secrets.TOKEN }}" -H "Content-Type: application/x-gzip" "https://uploads.github.com/repos/arm4rpi/pandoc-arm/releases/24024627/assets?name=$id" --data-binary @$id         done

后记

折腾这些主要是想给树莓派编译最新的 Pandoc,但是折腾了半个月,还是没成功,主要是 qemu-user-static 性能比较差,Haskell 编译本来就不快。结果就是 6 小时都没法执行完成,超过了 Github Action 的限制。还有就是 Haskell 编译很耗内存,Github Action 内存已经挺大了,还需要建 swap。但是这种方法应该还是有意义的,其他程序应该不至于这么耗时。

还是 Golang 方便,编译快,交叉编译也很简单:

 
1 CGO_ENABLED=0 GOOS=linux GOARCH=arm go build

参考资料

 
1 1. https://www.jianshu.com/p/ee7ba9a188d0

标签:aarch64,sudo,golang,编译,base,static,arm64,linux,qemu
From: https://www.cnblogs.com/hd92/p/17323796.html

相关文章

  • linux 系统下的服务性能优化
    背景在我们服务运行环境由物理机切换到云上后,发现服务性能有大幅下降(时延有较大的上升)。分析首先是服务的性能变化和上云有关。然后分析对比物理机和云的参数对比。比如外部竞争;云的宿主机系统版本;perfstat分析内存情况等。1、外部竞争:因为云上容器是和其他容器混部,难免会受......
  • Golang - Option模式(2)(函数选项模式)
    函数式选项模式(FunctionalOptionsPattern)函数式选项模式是一种在Go中构造结构体的模式,它通过设计一组非常有表现力和灵活的API来帮助配置和初始化结构体。优缺点选项模式有很多优点,例如:支持传递多个参数并且在参数发生变化时保持兼容性;支持任意顺序传递参数;支持默认值;方......
  • How to use the Raspberry Pi to study the Linux kernel source code All In One
    HowtousetheRaspberryPitostudytheLinuxkernelsourcecodeAllInOne如何利用树莓派来研究Linux内核源码AllInOnehttps://github.com/torvalds/linux学习笔记在Linux系统中,一切皆文件!(......
  • 《Linux基础》07. 软件管理
    目录1:软件管理1.1:rpm1.1.1:查询1.1.2:卸载1.1.3:安装1.2:yum1.3:dpkg1.4:apt1.4.1:相关配置1.4.2:常用指令1.4.3:相关指令rpm、yum、apt。三剑客。1:软件管理一般来说,Linux系统基本上可分为两大类:RedHat系列:Redhat、Centos、Fedora等Debian系列:Debian、Ubuntu等而两个系列自......
  • Linux系统知识(目录)-目录
    1、Linux系统知识(一)-VM虚拟机安装Ubuntu_Server版2、Linux系统知识(二)-Root用户登录Ubuntu并且可以SSH3、Linux系统知识(三)-puTTy远程Linux4、Linux系统知识(四)-Shell脚本学习笔记5、Linux系统知识(五)-Ubuntu18.04忘记密码6、Linux系统知识(六)-Ubuntu系统备份_Respin7、Linux系统......
  • Linux设备文件自动生成
    原文:https://www.cnblogs.com/chen-farsight/p/6154941.html第一种是使用mknod手工创建:#mknod<devfilename><devtype><major><minor>第二种是自动创建设备节点:利用udev(mdev)来实现设备文件的自动创建,首先应保证支持udev(mdev),由busybox配置。   具体udev相关知识这里不......
  • Linux硬盘知识(三)-硬盘的扩容与缩减
    提示:大部分分区的缩减需要挂载到另一个Ubuntu。1、Boot引导分区等可以直接在gparted里挂载的盘挂载到另一个Ubuntu,使用工具gparted对Boot与EFI盘进行操作2、LVM逻辑盘扩张与缩减(LVM一般包括"根目录"与"swap"逻辑)1) 扩张不需要挂载到另一个Ubuntu;详见:https://blog.csdn.net......
  • Linux硬盘知识(目录)-目录
    一,清理硬盘  Linux硬盘知识(一)-清理硬盘二,移植系统  Linux硬盘知识(二)-移植系统三,Linux硬盘的扩容与缩减  ......
  • Linux id 命令
    Linuxid命令Linuxid命令用于显示用户的ID,以及所属群组的ID。id会显示用户以及所属群组的实际与有效ID,若两个ID相同,则仅显示实际ID,若仅指定用户名称,则显示目前用户的ID。该命令会显示用户的UID(UserID)、GID(GroupID)以及附属于用户的所有组ID。语法id[-gGnru][--he......
  • Linux groupadd 命令
    Linuxgroupadd命令groupadd命令用于创建一个新的工作组,新工作组的信息将被添加到系统文件中。相关文件:/etc/group组账户信息。/etc/gshadow安全组账户信息。/etc/login.defsShadow密码套件配置。语法groupadd命令语法格式如下:groupadd[-ggid[-o]][-r][-f]......