(请保留-> 作者: 罗冰)
Windows下搭建环境、编译、运行等一系列工作,都已经比较熟练了。不过,鉴于Intel提供的调试工具(之前博客中讲述过)Linux版本的都比windows新:
图1 已经两年没更新的调试工具
我觉得还是有必要在Linux下把开发环境建立起来。何况,我平常用来开发UEFI的Windows虚拟机实在太大了,动辄50G,装完必要软件后,只剩下10多个G。
1 安装所需工具
我使用的是Ubuntu 16.04+UDK2018,仍旧参照这个网页操作:https://github.com/tianocore/tianocore.github.io/wiki/UDK2018-How-to-Build#how-to-build-linux-like-system
首先安装必须的软件:
sudo apt-get install build-essential uuid-dev iasl git gcc-5 nasm python3-distutils
安装过程中,发现python3-distutils无法定位,没搞清楚怎么回事。不过我的Ubutnu中已经安装了python3,我选择忽略这个问题,把其他的软件安装好了再说(文末有解决此问题的方法) 。
安装完后,检查下gcc的版本:
图2 Gcc版本
第二步,将edk2-vUDK2018.tar.gz解压到~/src/MyWorkspace下。
第三步,拷贝OpenSSL Crypto Library。步骤很简单,到指定的网站下载openssl库:https://github.com/openssl/openssl/archive/OpenSSL_1_1_0g.zip ,解压到指定文件夹下。
我的系统中是这样的:
图3 openssl文件夹
第四步,生成BaseTools。进入目录~/src/MyWorkspace,运行“make -C BaseTools”,生成所需的工具软件。
建立完成后,试试看能否编译。
. edksetup.sh
build -p MdeModulePkg/ MdeModulePkg.dsc -t GCC5
如果没有报错,则说明开发环境搭建成功了。
2 配置UDK2018开发环境
编辑Conf/target.txt。根据我的编译环境,使用的是gcc 5.4.0,那么TOOL_CHAIN_TAG=GCC5。其余配置如下:
ACTIVE_PLATFORM = EmulatorPkg/ EmulatorPkg .dsc
TARGET = DEBUG
TARGET_ARCH = IA32
TOOL_CHAIN_TAG = GCC5
MAX_CONCURRENT_THREAD_NUMBER = 4 #我的机器上支持多线程
BUILD_RULE_CONF = Conf/build_rule.txt
如果看过我之前的博客,会知道这些配置也可以不改,在build的时候通过命令行指定也是可以的。具体可以去看下第26篇博客。
关于编译工具的选项,可以查看tools_def.txt,编译的选项在此都能找到。
3 模拟器的编译
以前linux下的模拟器在UnixPkg中,之后都移到EmulatorPkg中了。查看Package目录中的文件README,它目前支持在Linux和OS X中工作,未来将支持Win32和Win64。也就是说,Nt32Pkg也将退出舞台了?
README中提供了快速编译此Package的方法,我还是不大习惯,仍旧用以前的方法编译吧。命令行中输入:
build -p EmulatorPkg/EmulatorPkg.dsc
编译之后,发现一个问题:无法启动。试了好几种方法之后,我放弃了。(后补:实际上到编译好的目录下,运行Host就可以启动了)
按照README中的方法重新编译,发现缺少编译的头文件和库。一个个解决之后(解决方法在文末),编译成功。
启动:EmulatorPkg/build.sh -a IA32 run,出现了熟悉的模拟环境:
图4 ubuntu下启动UEFI模拟环境
不过,在模拟环境下试图运行HelloWorld.efi,报错了:
Command Error Status: Access Denied
如果运行”dir”命令,则会被中断下来,到底怎么回事?
我把HelloWorld.efi拷贝到win10的开发环境中,在TianoCore模拟环境中运行,是正常的。
一番折腾之后,我怀疑UDK2018本身的EmulatorPkg有点问题。我准备用最新的EDK2来进行编译。
在src目录下运行如下命令:
git clone http://github.com/tianocore/edk2.git edk2
将EDK2的文件全部下载到~/src/edk2中,按照上一节的方法,编译BaseTools,修改/conf/target.txt,编译MdeModulePkg。(编译用的工具之前都已经安装了,不用再安装)
然后尝试编译EmulatorPkg,也很正常。启动模拟器:
图5 EDK2编译后的模拟环境
可以看到,很正常的运行了HelloWorld.efi。那UDK2018为什么在Ubuntu上运行模拟器不正常?明明在win10上,一直用到现在都没有出过问题。有机会再研究研究。
4 编译程序
我在win10+UDK2018上,一直都是使用AppPkg进行编译的。在AppPkg.dsc中指明编译的程序位置,可以让我把自己所有的程序都放在一个目录_LuoApp下,非常方便。
可是在ubuntu16上去编译AppPkg时,出了点问题:
图6 编译AppPkg出现问题
花了一天找资料,没有找到解决的办法。只能把需要编译的程序在EmulatorPkg中进行编译了。
当然,main()作为起始函数的程序没法编译,找了一个用UefiMain()作为起始函数的例子。
图7 EmulatorPkg.dsc中添加需要编译的程序
运行命令:build -m _LuoApp/Luo5/Luo5.inf -p EmulatorPkg/EmulatorPkg.dsc
编译之后在模拟环境中运行,效果如下:
图8 运行效果
AppPkg的问题找时间再去寻找原因,如果搞定,将在问题辑录中做出说明。
本篇Q&A:
1 Q:安装不了python3-distutils,提示无法定位。
Answer:
sudo vim/etc/apt/sources.list
添加源:
deb http://cn.archive.ubuntu.com/ubuntu bionic main multiverse restricted universe
deb http://cn.archive.ubuntu.com/ubuntu bionic-updates main multiverse restricted universe
deb http://cn.archive.ubuntu.com/ubuntu bionic-security main multiverse restricted universe
deb http://cn.archive.ubuntu.com/ubuntu bionic-proposed main multiverse restricted universe
再执行如下指令:
sudo apt-get update
sudo apt-get install python3-distutils
2 Q:编译EmulatorPkg时提示缺少各种头文件
Answer:
缺少sys/cdefs.h
sudo apt install libc6-dev-i386
缺少X11/Xlib.h
sudo apt-get install libx11-dev
sudo apt-get install libx11-dev:i386
缺少X11/extensions/XShm.h
sudo apt-get install libxext-dev
sudo apt-get install libxext-dev:i386