当前位置:   article > 正文

UEFI EDK2 Ubuntu20.04上环境搭建记录与踩坑_edk2支持的gcc版本

edk2支持的gcc版本

前言

不是我不想更新博客,实在是没时间更新,一方面刚入职,公司有很多东西要学,另一方面,自己有很多坑没填完。最近在学习UEFI,先更新一波UEFI的学习过程。

环境配置

我使用的教材是罗冰编写的《UEFI编程实践》以及《UEFI编程原理》,前者针对更新版本的UEFI进行编写,所以我主要参考《UEFI编程实践》进行环境搭建。

搭建的环境为:Vmware 15.0+Ubuntu 20.04

# 如果git速度慢可以输入下面的指令试一下,
# git config --global url."https://hub.fastgit.org".insteadOf https://github.com

新建文件夹workspace:
git clone https://github.com/tianocore/edk2.git
git clone https://github.com/tianocore/edk2-libc.git
git clone https://github.com/acpica/acpica.git

分别进入上面三个文件夹
输入:git submodule update --init

可能要安装一些依赖包
sudo apt install git python3 python3-distutils \
uuid-dev nasm bison flex

sudo apt install gcc g++ build-essential qemu qemu-system  

输入 gcc --version 和 make --version
有版本信息说明OK,下一步

回到workspace文件夹
输入make -C edk2/BaseTools
输入make -C acpica/

touch mybuild.sh | vim mybuild.sh

输入
#!/bin/bash
export WORKSPACE=$PWD
export PACKAGES_PATH=$PWD/edk2:$PWD/edk2-libc
export IASL_PREFIX=$PWD/acpica/generate/unix/bin/
export PYTHON_COMMAND=/usr/bin/python3
保存 再sudo chmod a+x mybuild.sh


#!!!!! 注意,EDK2上写的是支持GCC5, \
而Ubuntu20.04自带的编译器是GCC9了 \
为了不踩坑,我手动替换了GCC9 > GCC5 

替换过程为如下:
sudo vim  /etc/apt/sources.list
在行末加入
# Ubuntu 16
deb http://mirrors.aliyun.com/ubuntu/ xenial main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main

deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main

deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe

deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe
保存后输入sudo apt-get update
apt install gcc-5 g++-5

添加gcc版本
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 40
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 50
切换gcc版本
sudo update-alternatives --config gcc

同理,将上诉gcc替换成g++,配置g++

选择gcc和g++为版本5.4
这里环境配置就结束了

  • 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
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74

编译

编译Emulator模拟器,Emulator可在Linux和win10上运行
在workspace文件夹下输入 
source ./mybuild.sh
source edk2/edk2setup.sh

build -p  edk2/EmulatorPkg/EmulatorPkg.dsc -a X64 -t GCC5 
编译完成后进入
Build/EmulatorX64/DEBUG_GCC5/X64下输入
./Host
就可以启动Emulator&&UEFI了
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Qemu

编译

build -a X64 -t GCC5 -p edk2/OvmfPkg/OvmfPkgX64.dsc
  • 1

运行

qemu-system-x86_64 -bios Build/OvmfX64/DEBUG_GCC48/FV/OVMF.fd -M pc -m 256 -cpu qemu64 -vga cirrus -name UEFI -boot order=dc
  • 1

勘误

编译成功,但是启动Emulator提示段错误

原因和GCC优化有关,指定 -O0即可
打开edk2/Conf/tool_def,把和我们相关的编译参数进行替换 -Os改为-O0

#DEFINE GCC_ALL_CC_FLAGS            = -g -Os -fshort-wchar -fno-builtin -fno-strict-aliasing -Wall -Werror -Wno-array-bounds -include AutoGen.h -fno-common
DEFINE GCC_ALL_CC_FLAGS            = -g -O0 -fshort-wchar -fno-builtin -fno-strict-aliasing -Wall -Werror -Wno-array-bounds -include AutoGen.h -fno-common
#  DEBUG_GCC5_X64_CC_FLAGS        = DEF(GCC5_X64_CC_FLAGS) -flto -DUSING_LTO -Os
DEBUG_GCC5_X64_CC_FLAGS        = DEF(GCC5_X64_CC_FLAGS) -flto -DUSING_LTO -O0
  
#  DEBUG_GCC5_X64_DLINK_FLAGS     = DEF(GCC5_X64_DLINK_FLAGS) -flto -Os
DEBUG_GCC5_X64_DLINK_FLAGS     = DEF(GCC5_X64_DLINK_FLAGS) -flto -O0

#RELEASE_GCC5_X64_CC_FLAGS        = DEF(GCC5_X64_CC_FLAGS) -flto -DUSING_LTO -Os -Wno-unused-but-set-variable -Wno-unused-const-variable
#RELEASE_GCC5_X64_DLINK_FLAGS     = DEF(GCC5_X64_DLINK_FLAGS) -flto -Os

RELEASE_GCC5_X64_CC_FLAGS        = DEF(GCC5_X64_CC_FLAGS) -flto -DUSING_LTO -O0 -Wno-unused-but-set-variable -Wno-unused-const-variable
RELEASE_GCC5_X64_DLINK_FLAGS     = DEF(GCC5_X64_DLINK_FLAGS) -flto -O0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

再编译即可

编译不成功

1.注意是否指定为X64,IA32涉及到过多的依赖包配置,建议采用X64
2.有依赖包没装,自己百度搜一下缺的头文件,apt install xx即可

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/1012656
推荐阅读
相关标签
  

闽ICP备14008679号