UEFI开发探索37 – Linux下环境搭建

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

175 total views, 2 views today

发表评论

电子邮件地址不会被公开。 必填项已用*标注