Yocto学习笔记1-下载与首次编译

Yocto学习笔记1-下载与首次编译

  • 1、基础环境介绍
  • 2、注意点
  • 3、安装依赖
    • 3.1 yocto常规系统构建所需依赖库(较全)
    • 3.2 龙芯适配时的最小依赖库(最小)
  • 4、下载
    • 4.1 通过git克隆
    • 4.2 查看所有远程分支
    • 4.3 签出一个长期支持的稳定版本
    • 4.4 查看当前本地分支版本
  • 5、使能编译环境
  • 6、开始Yocto编译
  • 7、编译中的遇到的问题
    • 7.1 在编译bison(版本bison-3.0.4)时遇到gnulib版本不匹配问题
    • 7.2 elfutils编译错误
    • 7.3 glib编译错误:directive argument is null(2处)
    • 7.4 qemu编译报错

1、基础环境介绍

操作系统:ubuntu 20.04
内存大小:12GB
磁盘空间:600GB

2、注意点

yocto poky下载和编译的整个环境(除了运行QMENU虚拟机外)不需要root权限,请尽可能不要在root环境下去操作。

3、安装依赖

3.1 yocto常规系统构建所需依赖库(较全)

sudo apt-get install -y gawk wget git diffstat unzip texinfo gcc build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev pylint3 xterm python3-subunit mesa-common-dev zstd liblz4-tool

3.2 龙芯适配时的最小依赖库(最小)

sudo apt-get install -y gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath socat libsdl1.2-dev xterm

4、下载

4.1 通过git克隆

$ git clone git://git.yoctoproject.org/poky
$ cd poky

一般网速较慢,请耐心等待…

4.2 查看所有远程分支

$ git branch -r

执行如下图:
在这里插入图片描述
在这里插入图片描述

4.3 签出一个长期支持的稳定版本

如果构建针对龙芯的系统,可以签出sumo版本,因为龙芯官方主要是sumo版本的基础上进行构建。

$ git checkout sumo
或者使用完整命令
$ git checkout -t origin/sumo -b my-sumo

执行如下:
在这里插入图片描述

4.4 查看当前本地分支版本

$ git branch

在这里插入图片描述

5、使能编译环境

先进入poky目录,看一下poky目录下的内容,如下:
在这里插入图片描述

在poky目录下执行以下命令

$ source oe-init-build-env

执行结果如下图:
在这里插入图片描述

出现提示:
You can also run generated qemu images with a command like ‘runqemu qemux86’
说明使能编译操作成功,首次使能的时候会创建build目录,后面包括编译和输出的所有东西都在这个build目录下,所以build目录下的改动都是临时的,都是会变化的,所以不建议在build目录下去做代码的修改,也无法保存下来,当然也不要怕去修改build目录下的代码,为了快速和临时改动是可以接受的。

在执行 source oe-init-build-env时需要用到python2,且要求版本≥2.7.3,我的环境开始是python2和python3都安装了,默认/usr/bin/python软链接指向python3,就会出现以下错误。

在这里插入图片描述

解决此问题的方法, 可以先删除/usr/bin/python软链接,再建立一个指向/usr/bin/python3的软链接就可以了,如下:

在这里插入图片描述

6、开始Yocto编译

在build目录下执行以下命令开始编译:

$ bitbake core-image-sato

编译过程如下图:
在这里插入图片描述
因为要下载配方中的软件包并进行配置、编译、安装,第一次时间是很长的,需要耐心等待…

7、编译中的遇到的问题

7.1 在编译bison(版本bison-3.0.4)时遇到gnulib版本不匹配问题

问题描述如下:

Please port gnulib fseterr.c to your platform! Look at the definitions of ferror and cleareer on your system, then report this to bug-gnulib.

如下图:
在这里插入图片描述
问题分析:
网上查阅后是最新版本gnulib与bison不大兼容,一般正确做法是给要编译的软件包打补丁,包括以下2步。

  • 1、补丁下载
    补丁下载地址:

https://raw.githubusercontent.com/rdslw/openwrt/e5d47f32131849a69a9267de51a30d6be1f0d0ac/tools/bison/patches/110-glibc-change-work-around.patch

可以新开一个SSH终端,进入到软件包目录下直接通过wget下载,如下:

$ cd ~/Linux/yocto/poky/meta/recipes-devtools/bison/bison
$ wget https://raw.githubusercontent.com/rdslw/openwrt/e5d47f32131849a69a9267de51a30d6be1f0d0ac/tools/bison/patches/110-glibc-change-work-around.patch

下载后如下图:
在这里插入图片描述

  • 2、把下载的补丁添加到.bb文件中
    回到上一级目录,编辑bison_3.0.4.bb文件,添加110-glibc-change-work-around.patch补丁文件。
$ cd ..
$ ls
$ vim bison_3.0.4.bb

修改内容如下:
在这里插入图片描述
修改后保存退出,重新执行编译命令:

$ bitbake core-image-sato

7.2 elfutils编译错误

错误描述:

‘__elf64_msize’ specifies less restrictive attribute than its target ‘elf64_fsize’: ‘const’ [-Weeror=missing-attributes]
yocto官方patch可以参考如下:
https://docs.yoctoproject.org/pipermail/yocto/2019-June/045575.html

报错原因为warning被看作error,实质是elf中__elf64_msize变量为const,但是这里使用的时候没有标记,所以需要添加对应属性;

报错信息如下图:
在这里插入图片描述
进入到源码libelfP.h所在的目录:

$ cd ~/Linux/yocto/poky/build/tmp/work/x86_64-linux/elfutils-native/0.170-r0/libelf
$ vim libelfP.h

代码修改如下,增加2个__const_attribute__
在这里插入图片描述

7.3 glib编译错误:directive argument is null(2处)

错误描述:

…/…/glib-2.54.3/gio/gdbusauth.c:1305:11: error: ‘%’ directive argument is null [-Werror=format-overflow=]

报错信息如下图:
在这里插入图片描述

上图错误是在gdbusauth.c的1305行。

在这里插入图片描述

上图的错误是在gdbusmessage.c的2700行。

根据提示,%s的值可能为空,所以添加为空判断,如下:

gdbusauth.c修改如下:

首先进入到源码中gdbusauth.c所在的目录,然后编辑:

$ cd ~/Linux/yocto/poky/build/tmp/work/x86_64-linux/glib-2.0-native/1_2.54.3-r0/glib-2.54.3/gio
$ vim gdbusauth.c

在这里插入图片描述

gdbusmessage.c修改如下:

首先进入到源码中gdbusauth.c所在的目录,然后编辑:

$ cd ~/Linux/yocto/poky/build/tmp/work/x86_64-linux/glib-2.0-native/1_2.54.3-r0/glib-2.54.3/gio
$ vim gdbusauth.c

在这里插入图片描述

7.4 qemu编译报错

可以先通过以下命令查看一下单独编译qemu有那些可执行的任务task:

$ bitbake qemu -c listtasks

单独编译qemu

$ bitbake qemu

可以看到编译报错及警告如下:
在这里插入图片描述
1、手动处理方式:按以下思路进行修改:

1. gettid 需要rename 为 sys_gettid
2. stime 更新为 clock_settime
3. ‘SIOCGSTAMP’ undeclaration ,需要导入头文件<linux/sockios.h>

2、补丁处理方式:处理方式,网上能搜索到的的qemu-2.10.0版本补丁可以参考,参考一下补丁可以解决gettid与 ‘SIOCGSTAMP’ undeclaration问题。

由于我的qemu版本是2.11.1,因此下面补丁对应的行数是不太一样的。

--- qemu-2.10.0-clean/linux-user/syscall.c	2020-03-12 18:47:47.898592169 +0100
+++ qemu-2.10.0/linux-user/syscall.c	2020-03-12 19:16:41.563074307 +0100
@@ -34,6 +34,7 @@
 #include <sys/resource.h>
 #include <sys/swap.h>
 #include <linux/capability.h>
+#include <linux/sockios.h> // https://lkml.org/lkml/2019/6/3/988
 #include <sched.h>
 #include <sys/timex.h>
 #ifdef __ia64__
@@ -116,6 +117,8 @@ int __clone2(int (*fn)(void *), void *ch
 #include "qemu.h"

+extern unsigned int afl_forksrv_pid;
+
 #ifndef CLONE_IO
 #define CLONE_IO                0x80000000      /* Clone io context */
 #endif
 
@@ -256,7 +259,9 @@ static type name (type1 arg1,type2 arg2,
 #endif

 #ifdef __NR_gettid
-_syscall0(int, gettid)
+// taken from https://patchwork.kernel.org/patch/10862231/
+#define __NR_sys_gettid __NR_gettid
+_syscall0(int, sys_gettid)
 #else
 /* This is a replacement for the host gettid() and must return a host
    errno. */
@@ -6219,7 +6224,8 @@ static void *clone_func(void *arg)
     cpu = ENV_GET_CPU(env);
     thread_cpu = cpu;
     ts = (TaskState *)cpu->opaque;
-    info->tid = gettid();
+    // taken from https://patchwork.kernel.org/patch/10862231/
+    info->tid = sys_gettid();
     task_settid(ts);
     if (info->child_tidptr)
         put_user_u32(info->tid, info->child_tidptr);
@@ -6363,9 +6369,11 @@ static int do_fork(CPUArchState *env, un
                mapping.  We can't repeat the spinlock hack used above because
                the child process gets its own copy of the lock.  */
             if (flags & CLONE_CHILD_SETTID)
-                put_user_u32(gettid(), child_tidptr);
+                // taken from https://patchwork.kernel.org/patch/10862231/
+                put_user_u32(sys_gettid(), child_tidptr);
             if (flags & CLONE_PARENT_SETTID)
-                put_user_u32(gettid(), parent_tidptr);
+                // taken from https://patchwork.kernel.org/patch/10862231/
+                put_user_u32(sys_gettid(), parent_tidptr);
             ts = (TaskState *)cpu->opaque;
             if (flags & CLONE_SETTLS)
                 cpu_set_tls (env, newtls);
@@ -11402,7 +11410,8 @@ abi_long do_syscall(void *cpu_env, int n
         break;
 #endif
     case TARGET_NR_gettid:
-        ret = get_errno(gettid());
+        // taken from https://patchwork.kernel.org/patch/10862231/
+        ret = get_errno(sys_gettid());
         break;
 #ifdef TARGET_NR_readahead
     case TARGET_NR_readahead:

关于stime的问题,按如下方式修改。

//ret = get_errno(stime(&host_time));	//注释使用stime的这一行,增加下面这一行改为clock_settime(CLOCK_REALTIME, &host_time)
ret = get_errno(clock_settime(CLOCK_REALTIME, &host_time));

修改完这些,qemu-2.11.1就可以编译过去了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/482546.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 15.三数之和 JAVA 双指针法

题目 思路 双指针法 去重 为啥要去重呢&#xff1f;因为题目中说了要返回不重复的三元组。拿示例1来看&#xff0c;&#xff08;-1&#xff0c;0&#xff0c;1&#xff09;和&#xff08;0&#xff0c;1&#xff0c;-1&#xff09;虽然都等于0&#xff0c;但其实它们里面的数…

【python_往企业微信群中发送文件】

python_往企业微信群中发送文件 这个是用企业微信群机器人的功能&#xff0c;没有用到后台应用。群机器人 #-*- coding:utf-8-* import requests#类型&#xff1a;voice,file file_type"file" file_path"D:\desktop\不过.jpg" webhookkey"xxxx"#…

ShuffleNet模型详解

ShuffleNet论文地址&#xff1a;1707.01083.pdf (arxiv.org) ShuffleNetv2论文地址&#xff1a;1807.11164.pdf (arxiv.org) ShuffleNetv1 简介 ShuffleNet 是专门为计算能力非常有限的移动设备设计的。架构采用了逐点分组卷积和通道shuffle两种新的运算&#xff0c;在保持…

【异或】Leetcode 136. 只出现一次的数字

【异或】Leetcode 136. 只出现一次的数字 解法1 只需要全部异或一下&#xff0c;剩下的就是剩下的元素 ---------------&#x1f388;&#x1f388;题目链接 136. 只出现一次的数字&#x1f388;&#x1f388;------------------- 解法1 只需要全部异或一下&#xff0c;剩下的…

Fast-R-CNN论文笔记

目标检测之Fast R-CNN论文精讲&#xff0c;Fast RCNN_哔哩哔哩_bilibili 一 引言 1.1 R-CNN和SPPNet缺点 &#x1f600;R-CNN Training is a multi-stage pipeline 多阶段检测器&#xff08;两阶段和一阶段检测器&#xff09; 1️⃣首先训练了一个cnn用来提取候选区域的特征…

深入浅出Reactor和Proactor模式

Reactor模式和Proactor模式是两种常见的设计模式&#xff0c;用于处理事件驱动的并发编程。它们在处理IO操作时有着不同的工作方式和特点。 对于到来的IO事件&#xff08;或是其他的信号/定时事件&#xff09;&#xff0c;又有两种事件处理模式&#xff1a; Reactor模式&…

jupyter | 查询/列出available kernels

jupyter kernelspec list 添加kernel python -m ipykernel install --user --name 虚拟环境名 --display-name 在jupyter中显示的环境名称 移除kernel jupyter kernelspec remove 环境名

部标JT808车辆定位监控平台单服务器13.6万接入压力测试记录(附源码)

之前经常有人问平台能支持多少设备同时在线&#xff0c;由于事情多没时间做。最近刚好有机会做下压力测试。在不间断的连续压测三天&#xff0c;最终结果为13.6万TCP连接&#xff0c;30秒上报频率。 一、测试目的 测试平台同时接入设备数量与并发处理能力。 二、准备环境 一…

javaweb--JavaScript

一&#xff1a;简介 JavaScript 是一门跨平台、面向对象的脚本语言 &#xff0c;用来控制网页行为的&#xff0c;它能使网页可交互 JavaScript 和 Java 是完全不同的语言&#xff0c;不论是概念还是设计&#xff0c;只是名字比较像而已&#xff0c;但是基础语法类似 JavaScri…

揭秘国产龙蜥OS操作系统:高效学习之路等你开启!

介绍&#xff1a;Anolis OS是一个完全开源、中立且开放的Linux发行版&#xff0c;专为多种计算场景设计&#xff0c;特别适合云端环境。 Anolis OS的推出旨在为广大开发者和运维人员提供一个稳定、高性能、安全、可靠且开源的操作系统服务。以下是Anolis OS的几个重要特点&…

mysql80-DBA数据库学习1

掌握能力 核心技能 核心技能 mysql部署 官网地址www.mysql.com 或者www.oracle.com https://dev.mysql.com/downloads/repo/yum/ Install the RPM you downloaded for your system, for example: yum install mysql80-community-release-{platform}-{version-number}.noarch…

window10系统~如何关闭电脑的防火墙?

电脑桌面左下角选择放大镜&#xff0c;搜索&#xff1a;防火墙2. 点击【防火墙和网络保护】 3. 把下面三个地方都关闭掉&#xff1a; 点击【域网络】&#xff0c;关闭如下按钮&#xff1a; 再返回到上层&#xff0c;如下的界面&#xff1a; 用上面相同的方法&#xff0c;依…

阿里云有免费服务器吗?有的,附送免费服务器申请流程

阿里云服务器免费试用申请链接入口&#xff1a;aliyunfuwuqi.com/go/free 阿里云个人用户和企业用户均可申请免费试用&#xff0c;最高可以免费使用3个月&#xff0c;阿里云服务器网分享阿里云服务器免费试用申请入口链接及云服务器配置&#xff1a; 阿里云免费服务器领取 阿里…

APP测试中ios和androis的区别,有哪些注意点

目录 一、运行机制不同 二、对app内存消耗处理方式不同 三、后台制度不同 四、最高权限指令不同 五、推送机制不同 六、抓取方式不同 七、灰度发版机制不同 八、审核机制不同 一、运行机制不同 IOS采用的是沙盒运行机制&#xff0c;安卓采用的是虚拟机运行机制。 1、…

[套路] 浏览器引入Vue.js场景-WangEditor富文本编辑器的使用 (永久免费)

系列文章目录 [套路] el-table 多选属性实现单选效果[套路] 基于服务内存实现的中文拼音混合查询[套路] Bypass滑块验证码 目录 系列文章目录前言一、实现1.1 场景1.2 Window对象简介1.3 引入WangEditor1.4 页面配置 前言 公司使用freemarker的老旧SpringBootWeb后台项目, 前…

RPG Maker MV 踩坑九 场景和窗口问题

RPG Maker MV 踩坑九 场景和窗口问题 启言场景窗口场景和窗口问题战斗场景 启言 在RPG Maker MV中使用的语言是JavaScript作为脚本语言&#xff0c;在HTML中的Canvas画布上进行绘制图像及交互行为。 在游戏中能够感知到的最大的容器是场景,往下就是各种用于菜单操作的窗口&…

通过nginx配置文件服务器(浏览器访问下载)

配置服务器端文件下载和展示(Nginx) nginx.conf文件中增加配置&#xff0c;然后浏览器里访问ip:port回车即可 server { listen port; server_name 服务端ip; # 指定文件下载目录的路径 location / { # 使用root指令来设置文件的根目录 # Nginx会在该目录下寻找相对于loca…

洛谷B3626 跳跃机器人

#先看题目 题目描述 地上有一排格子&#xff0c;共 n 个位置。机器猫站在第一个格子上&#xff0c;需要取第n 个格子里的东西。 机器猫当然不愿意自己跑过去&#xff0c;所以机器猫从口袋里掏出了一个机器人&#xff01;这个机器人的行动遵循下面的规则&#xff1a; 初始时…

基于SpringBoot的大学生租房系统

开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea 系统展示 系统功能模块 系统首页界面图 用户…

有什么可以下载网页视频的浏览器插件 浏览器如何下载网页视频 网页视频怎么下载到本地 网页视频下载软件 IDM下载

在视频网站上看电影追剧&#xff0c;已经成为了大众生活中必不可少的一部分。为了保护自家视频的版权&#xff0c;很多平台都禁止用户下载会员视频。其实只要掌握了正确的方法&#xff0c;一样可以将会员视频下载到本地保存。那么有关有什么可以下载网页视频的浏览器&#xff0…