diff --git a/articles/20230929-elf2flt-elf2flt-build-1.md b/articles/20230929-elf2flt-elf2flt-build-1.md
new file mode 100644
index 0000000000000000000000000000000000000000..2d179bae1d8ea80c3286ba86309ef009697e9229
--- /dev/null
+++ b/articles/20230929-elf2flt-elf2flt-build-1.md
@@ -0,0 +1,236 @@
+> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.2-rc2 - [spaces images pangu autocorrect epw]
+> Author:    Odysseus <320873791@qq.com>
+> Date:      2023/09/19
+> Revisor:   walimis <>
+> Project:   [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
+> Proposal:  [为 ELF2FLT 完善独立编译与安装支持](https://gitee.com/tinylab/riscv-linux/issues/I79PO2)
+> Sponsor:   PLCT Lab, ISCAS
+
+# elf2flt 篇三 使用
+
+## 前言
+
+在本机安装完 elf2flt 后,我们就可以使用它构建 bFLT 程序,并放到 no-MMU 的 Linux 系统中运行。
+
+我们首先需要一个 no-MMU RISC-V 的系统,这里我们使用 Buildroot 构建的 QEMU 镜像来进行测试。
+
+## 准备
+
+准备工作分两部分,一个是 uClibc 的构建,另外一个是 Buildroot 的构建。uClibc 与 bFLT 程序的关系会在“使用”一节详细说明,此处暂且认为它是 bFLT 程序执行所需要的依赖库;Buildroot 主要用于测试构建完成的 bFLT 程序。
+
+### Buildroot 构建
+
+首先我们进入 cloud-lab 里面的 RISC-V 64 位实验环境。
+
+```bash
+$ tools/docker/run riscv-lab
+```
+
+等待片刻,我们就可以进入到 RISC-V 64 位的实验环境了。理论上本机并不需要 RISC-V 64 位的环境,有交叉编译工具链即可,真正需要 RISC-V 64 位的是无 MMU 的目标环境。
+
+而后,我们在 RISC-V-lab 里面安装 Buildroot。首先我们把 Buildroot 仓库克隆下来,进入到 Buildroot 目录:
+
+```sh
+$ cd /home/ubuntu
+$ git clone git://git.buildroot.net/buildroot
+$ cd buildroot
+```
+
+进入后,我们可能需要先安装 CMake。如果本机是 RISC-V 64 位环境且没有安装 CMake(例如我们的 riscv-lab 环境),Buildroot 会自己构建一份,此时会出现与 libatomic 库有关的错误。
+
+```sh
+$ sudo apt-get update
+$ sudo apt-get install cmake # riscv-lab needed
+```
+
+然后我们开始配置 Buildroot。由于我们是在 QEMU 上运行的 RISC-V 64 位 no-MMU 系统,因此采用 `qemu_riscv64_nommu_virt_defconfig` 配置:
+
+```sh
+$ make qemu_riscv64_nommu_virt_defconfig
+```
+
+最后开始构建:
+
+```sh
+$ make
+```
+
+构建完成后,生成的镜像在 `/home/ubuntu/buildroot/output/images` 下面。我们看一下这个目录下有什么:
+
+```sh
+$ cd /home/ubuntu/buildroot/output/images
+$ ls
+Image  rootfs.ext2  rootfs.tar  start-qemu.sh
+```
+
+这里的 `Image` 是系统镜像,`rootfs.ext2` 是磁盘镜像,`start-qemu.sh` 是系统镜像在 QEMU 上运行的启动脚本。由于下文需要将我们自己的 bFLT 文件拷贝到磁盘镜像下,我们先将其挂载:
+
+```sh
+$ sudo mkdir /mnt/buildroot-nommu
+$ sudo mount rootfs.ext2 /mnt/buildroot-nommu
+```
+
+然后我们启动镜像:
+
+```sh
+$ ./start-qemu.sh
+
+[    0.000000] Linux version 6.1.44 (ubuntu@riscv-lab) (riscv64-buildroot-linux-uclibc-gcc.br_real (Buildroot -gbdab4577-dirty) 12.3.0, GNU ld (GNU Binutils) 2.40) #1 SMP Tue Sep 26 00:35:20 CST 2023
+[    0.000000] random: crng init done
+[    0.000000] Machine model: riscv-virtio,qemu
+[    0.000000] Forcing kernel command line to: root=/dev/vda rw earlycon=uart8250,mmio,0x10000000,115200n8 console=ttyS0
+...
+[    2.438788] Run /sbin/init as init process
+Seeding 256 bits and crediting
+Saving 256 bits of creditable seed for next boot
+
+Welcome to Buildroot
+buildroot login: root
+Jan  1 00:00:10 login[34]: root login on 'console'
+~ #
+```
+
+至此,Buildroot 的准备工作已经完成。
+
+### uClibc 构建
+
+我们首先将 uClibc 克隆下来:
+
+```sh
+$ cd /home/ubuntu
+$ git clone git://uclibc-ng.org/git/uclibc-ng
+$ cd uclibc-ng
+```
+
+uClibc 依赖于 Linux 头文件,riscv-lab 实际上已经自带所需头文件,但是还存在一些小问题,我们需要动用 `riscv64-linux-gnu` 中的部分头文件手动进行软链接。
+
+```bash
+ln -s /usr/include/riscv64-linux-gnu/asm /usr/include/asm
+```
+
+链接完成后,我们打开配置菜单:
+
+```sh
+$ make menuconfig
+```
+
+配置菜单打开后如下:
+
+
+
+我们进入 "Target Architecture Features and Options" 菜单,并配置成如图所示:
+
+
+
+然后我们退出菜单,直接构建:
+
+```sh
+$ make
+```
+
+至此,uClibc 构建完成。我们看一下其中的目录结构:
+
+```sh
+$ ls
+COPYING.LIB              extra    ldso  libcrypt  libm        libuargp       MAINTAINERS    Makefile.in  Rules.mak
+COPYING.LIB.boilerplate  include  lib   libiconv  libpthread  libubacktrace  Makefile       Makerules    utils
+docs                     INSTALL  libc  libintl   librt       libutil        Makefile.help  README
+
+$ ls lib/
+crt1.o  libc.a
+```
+
+我们可以看到,编译出来的 libc 就在 `lib/` 下面,编译时直接链接上去即可;相关头文件在 `include/` 下。
+
+## 使用
+
+elf2flt 的使用实际上非常简单,只要安装完成,它就已经整合到我们的交叉编译工具链里面。
+
+bFLT 程序的构建过程是将源程序编译成 ELF,再将其与同为 ELF 格式的运行时库(例如 uClibc)进行静态链接,因此,理论上只要是 libc,无论其是 glibc、uClibc 还是 musl libc,都可以通过此种方式链接到 bFLT 程序里。这里以 uClibc 为例,讲解如何用整合进 elf2flt 的工具链编译一个可以运行的 bFLT 文件。
+
+首先,我们以一个简单的程序作为例子(`hello.c`):
+
+```c
+#include 
+int main() {
+        int num = 0;
+        printf("enter your number here:\n");
+        scanf("%d", &num);
+        printf("hello world from number %d!\n", num);
+        return 0;
+}
+```
+
+接下来我们利用本机的 Linux 头文件和 uClibc 库编译源程序:
+
+```sh
+$ gcc  -nostdinc -nostdlib \
+-include /labs/riscv-lab/uclibc-ng/include/libc-symbols.h \
+-I/home/ubuntu/uclibc-ng/include \
+-I/usr/bin/../lib/gcc/riscv64-linux-gnu/11/include \
+-I/usr/bin/../lib/gcc/riscv64-linux-gnu/11/include-fixed \
+-I/usr/include \
+/home/ubuntu/uclibc-ng/lib/crt1.o \
+/usr/lib/gcc/riscv64-linux-gnu/11/crti.o \
+/usr/lib/gcc/riscv64-linux-gnu/11/crtbeginT.o \
+-L/usr/lib/gcc/riscv64-linux-gnu/11 \
+-L/usr/lib/gcc \
+-L/home/ubuntu/uclibc-ng/lib \
+-Wl,--build-id=none -Wl,-elf2flt=-r -o hello-b-gcc  hello.c --static -lc -lgcc \
+/usr/lib/gcc/riscv64-linux-gnu/11/crtend.o \
+/usr/lib/gcc/riscv64-linux-gnu/11/crtn.o
+```
+
+注意到这里的链接过程所使用的库和头文件有三个来源:gcc、uClibc 和 Linux 头文件。很显然,来自 gcc 的库使用本机的也可以;Linux 头文件由于版本与 Buildroot 所构建的 Linux 版本不一致,可能会出现问题,这里可能需要自行获取 Buildroot 对应版本的 Linux 头文件。此处本机并未报错,说明没有发生版本冲突。
+
+生成可执行文件后,我们使用 flthdr 查看它的 header:
+
+```sh
+$ flthdr ./hello-b-gcc
+./hello-b-gcc
+    Magic:        bFLT
+    Rev:          4
+    Build Date:   Fri Sep 29 08:20:22 2023
+    Entry:        0x44
+    Data Start:   0x99a0
+    Data End:     0xb2d8
+    BSS End:      0xd420
+    Stack Size:   0x1000
+    Reloc Start:  0xb2d8
+    Reloc Count:  0x1f
+    Flags:        0x3 ( Load-to-Ram Has-PIC-GOT )
+```
+
+可以看到,编译过程没有问题,这个可执行文件确实是 bFLT 格式。
+
+然后我们把构建好的源程序放到挂载好的磁盘镜像中:
+
+```sh
+$ sudo cp ./hello-b-gcc /mnt/buildroot-nommu/root
+```
+
+最后我们运行 Linux 系统镜像,并在上面运行我们的 bFLT 程序:
+
+```sh
+$ cd /home/ubuntu/buildroot/output/images/
+$ ./start-qemu.sh
+
+~ # ls
+hello-b-gcc
+~ # ./hello-b-gcc
+enter your number here:
+114514
+hello world from number 114514!
+```
+
+## 总结
+
+本篇文章主要内容为 elf2flt 工具的使用,由于其能够整合进已有的交叉工具链中,故使用起来比较方便,但是需要注意编译时使用的 libc 库和头文件。
+
+## 参考资料
+
+- [https://gitee.com/tinylab/elf2flt][001]
+- [https://buildroot.org/downloads/manual/manual.html][002]
+
+[001]: https://gitee.com/tinylab/elf2flt
+[002]: https://buildroot.org/downloads/manual/manual.html
diff --git a/articles/images/20230929-elf2flt-elf2flt-build-1/menu-1.png b/articles/images/20230929-elf2flt-elf2flt-build-1/menu-1.png
new file mode 100644
index 0000000000000000000000000000000000000000..f31279cc70fcda60f6e6649211a47b46f457ed98
Binary files /dev/null and b/articles/images/20230929-elf2flt-elf2flt-build-1/menu-1.png differ
diff --git a/articles/images/20230929-elf2flt-elf2flt-build-1/menu-2.png b/articles/images/20230929-elf2flt-elf2flt-build-1/menu-2.png
new file mode 100644
index 0000000000000000000000000000000000000000..85fc852c97733713099232286deed150328639d8
Binary files /dev/null and b/articles/images/20230929-elf2flt-elf2flt-build-1/menu-2.png differ