第四节 编译与运行环境
我们成功完成了第一个内核版本的编译和运行实验,但是前面命令输入的过程太过繁琐了。下面通过建立一个 Makefile来简化输入工作。
完整的 Makefile 内容见附录 B。
把 Makefile 放到工作目录 arceos 之下,它定义了一些快捷操作:今后执行 make
就可以编译内核,或者直接执行 make run
来完成编译+运行。
尝试在工作目录下测试以下make命令的有效性。
make
make run
make clean
执行 Makefile 时可能遇到的问题:
(1) 如果在本地创建 Makefile,直接拷贝上面 Makefile 的内容,执行 make 时有可能遇到下面的错误:
Makefile:xxx: *** missing separator. Stop.
原因:recipe 必须以 TAB 进行缩进,但当拷贝时有可能拷贝进来的是空格。例如 Makefile 文件的第17行等等。
解决办法:把各种缩进统一替换为 TAB。
(2) 如果第二节中没有在 arceos 根目录下创建 linker.lds,就会报如下错误:
= note: rust-lld: error: cannot find linker script XXX/arceos/linker.lds
原因:Makefile 导出了环境变量 RUSTFLAGS,通过它通知 Rust,在链接时使用我们自定义的linker.lds 控制 Image 布局。在上一节,我们虽然漏掉了这一步骤,但是结果依然是正常的。原因大家已经看到了,当前的 Image 即 axorigin.bin 只包含一条指令,有无布局文件对结果毫无影响。今后随着代码的增加,LDS 文件将会起到关键作用。
解决办法:参照附录 A 在工作目录下建立 linker.lds。
最后看一下我们工作目录的构成情况:
.
├── axorigin
│ ├── Cargo.toml
│ └── src
│ ├── lang_items.rs
│ └── main.rs
├── LICENSE
├── linker.lds
├── Makefile
├── README.md
└── rust-toolchain.toml