OP-TEE 踩坑

因为要做系统模拟,所以决定在服务器上先搭个qemu试试

OP-TEE 文档上写的支持的是就Ubuntu20.04和22.04,但是作为超大胆我们服务器都是arch……
本来是想虚拟机或者docker解决,但是考虑到这种嵌套跑东西太麻烦就选择了直接用arch编译

很难受的是,并没有现成AUR包。

因为我相比c更熟悉rust,因此主要是跟随的https://optee.readthedocs.io/en/latest/building/optee_with_rust.html 这个篇章。

第一个坑是 repo init -u https://github.com/OP-TEE/manifest.git -m qemu_v8.xml 这里,因为是大家一起用的服务器,因此没有global的git.user.name 和email,repo工具就会报错。
这个时候就修改一下repo的git配置 manifests.git/config 这个问题,加入这样几行

1
2
3
[user]
name = MyName
email = [email protected]

然后重新init,之后sync

大坑在 (cd build && make toolchains && make OPTEE_RUST_ENABLE=y CFG_TEE_RAM_VA_SIZE=0x00300000) 这个部分,

首先 make toolchains 是需要从外部下载文件的,而且走的是wget,直接HTTPS_PROXY科学不管用,得开TUN之类的虚拟网卡 or 设置 ~/.wgetrc

然后编译过程中会一直遇到错误,大概分为这样几个:

  • command not found: 少命令,基本上pacman都能直接装
  • 少cryptography,这个得用pip安装 pip install cryptography;后面还有个缺 elftools 的提示,需要 pip install pyelftools,注意开头有py
  • edk2编译问题,原因是arch里gcc版本是12,会造成不兼容。参考下面三个网页第一个回复。应该改gcc版本也可以,但是用 CC 和 CXX 环境变量在make里好像没生效(没仔细看make内容

arch包管理装的内容大概这些,rust我是自己用AUR的rustup装的,python用的conda
yay -S base-devel repo dtc iasl bc cpio ninja libslirp

处理out_br过程中出现问题,会缺文件,然后编译生成,然后就直接退出(应该流程问题)

我这边先省略rust内容,直接用 (cd build && make run) 编译别的

后面步骤中出错挺麻烦,比如缺少 config.status 这种就是因为 ./configure 失败导致

curl 的问题,按理说应该 CFLAGS+=-Wno-error=deprecated-declarations 就可以的,但是这个make好像不传递给它的子make,CC什么的试了也都没用就只好改源码了

qemu/block/curl.c

- `CURLOPT_PROTOCOLS` -> `CURLOPT_PROTOCOLS_STR`: 就加个_STR
- `CURLOPT_REDIR_PROTOCOLS` -> `CURLOPT_REDIR_PROTOCOLS_STR`: 就加个_STR
- `CURLINFO_CONTENT_LENGTH_DOWNLOAD` -> `CURLINFO_CONTENT_LENGTH_DOWNLOAD_T`: 就加个_T