ubuntu 14.04 编译yocto源码
1. 环境安装
-
ubuntu 14.04
-
yocto依赖工具链
sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath socat cpio python python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping
-
源码已经就位
./makall
2. 错误记录
2.1 bash or dash
在kernel编译的时候提示no such arch:
这里就是shell脚本语言在做字符串匹配,而且同样的code在服务器是编译通过的,所以这里主要怀疑:
- gcc的lib库是否没有安装;
- sh是否没有安装;
经确认主机上与服务器上sh有差异,主机默认安装为dash,替换后此错误通过:
sudo dpkg-reconfigure dash,选择no
2.2 JDK 1.8 安装
在编译到service阶段的时候出现编译错误,提示语JDK相关,在安装openjdk 1.8后可以正常编译通过,这里记录openjdk 1.8的安装过程:
-
替换源:
- 由于ubuntu中默认没有支持openjdk,所以这里需要在source.list中加入;
- ubuntu官网毕竟是外网,访问如同龟速,这里替换为aliyun的镜像网站;
sudo cp sources.list sources.list.bak
sudo vim /etc/apt/sources.list具体内容:
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse ##测试版源 deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse ## 源码 deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse ##测试版源 deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse # Canonical 合作伙伴和附加 deb http://archive.canonical.com/ubuntu/ xenial partner deb http://extras.ubuntu.com/ubuntu/ xenial main
-
更新并安装jdk
sudo apt-get install update
sudo apt install openjdk-8-jre-headless
sudo apt install openjdk-8-jre
sudo apt install openjdk-8-jdk -
验证:
java -version
3.2.3 libinput 编译meson失败
-
出错环节:
gcc /code/20201016sumo/build/tmp/work/aarch64-poky-linux/libinput/1.9.4-r0/build/meson-private/sanitycheckc.c -o /code/20201016sumo/build/tmp/work/aarch64-poky-linux/libinput/1.9.4-r0/build/meson-private/sanitycheckc.exe
-
错误信息:
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/4.8/…/…/…/x86_64-linux-gnu/crti.o: unrecognized relocation (0x2a) in section `.init’
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status- 这里提示在链接crti.o时出错,地址不识别,这里多半认为是版本问题
- 将已经编译过得环境中crti.o替换到主机中,编译通过
- 说明是gnu lib库有差异
- gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3)
- gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.4)
-
处理方案:
- 在gnu lib中替换crti.o
3.2.4 打包ext4 image错误
-
错误提示:
make_ext4fs执行时有库找不到
-
ldd 命令查看链接库:
20201016sumo/src/build/tools$ ldd make_ext4fs
linux-gate.so.1 => (0xf773b000)
libstdc++.so.6 => not found -
file命令查看make_ext4fs
make_ext4fs: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped
结合错误信息来看,默认这个库安装时64bit的,所以需要安装对应32bit的libstdc++.so.6
-
处理:
sudo apt-get install lib32stdc++6
搞定收工
3.3 总结
错误原因大多为(环境配置):
- 缺少某些环境或者库,例如JDK等
- 某些环境的版本与code依赖版本不匹配,例如openssl、libgnu等等
- 某些工具配置不对,例如bash等
在新的环境编译新的系统,总会遇到各式各样的环境问题,整体思路就是确认出错步骤,单步执行打印提示,逐步check即可