From 908f682c33ccca90b892a77702c30c491d065da0 Mon Sep 17 00:00:00 2001 From: asterich Date: Wed, 20 Sep 2023 22:44:30 +0800 Subject: [PATCH 1/3] add article: elf2flt-elf2flt-build-0 --- articles/20230919-elf2flt-elf2flt-build-0.md | 63 ++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 articles/20230919-elf2flt-elf2flt-build-0.md diff --git a/articles/20230919-elf2flt-elf2flt-build-0.md b/articles/20230919-elf2flt-elf2flt-build-0.md new file mode 100644 index 0000000..5ccfa21 --- /dev/null +++ b/articles/20230919-elf2flt-elf2flt-build-0.md @@ -0,0 +1,63 @@ +# elf2flt 篇二 原理和构建 + +## 前言 + +我们在上一篇文章里分析了elf2flt的源码,现在我们来阐述其原理,并分析其构建过程。 + +## 原理解析 + +从上一篇的内容,我们发现对于 elf2flt 来说,其执行上是分成这样几个步骤的: + +1. 解析 ELF 文件:elf2flt 首先解析输入的 ELF 文件。这包括读取 ELF 头部、节表、程序头部以及节的内容等信息。 +2. 分析节表信息:elf2flt 分析 ELF 文件的节表,识别哪些节包含可执行代码、数据以及其他相关信息。通常,只有包含可执行代码和数据的节才会包含在 FLAT 文件中。 +3. 生成 FLAT 文件头部:elf2flt 创建一个 FLAT 文件头部,该头部包含了 FLAT 文件的元信息,如入口地址、代码段长度、数据段长度等。 +4. 将节内容复制到 FLAT 文件:elf2flt 从 ELF 文件中将识别出的代码和数据节的内容复制到 FLAT 文件中。这通常涉及将节的内容按照 FLAT 文件的格式进行重新组织和排列。 +5. 生成重定位信息:如果 ELF 文件包含重定位信息,elf2flt 会生成相应的 FLAT 文件重定位信息,以确保在加载 FLAT 文件时可以正确解析和处理符号引用。 +6. 生成 FLAT 文件:最后,elf2flt 将生成的 FLAT 文件写入磁盘,可以将其用于嵌入式系统中的启动加载。 + +其执行关键,也是之所以能将 elf 格式转化成可以供无 mmu 系统使用的 bFLT 格式的可执行文件的关键,是其将每节的虚拟地址映射到新生成的重定位信息中,使所有在运行时才确定关系的映射信息转为在加载时确定。 + +而动态链接库不是 elf2flt 能够处理的,在此就不说明。(PS:动态链接库可以考虑通过定制化的动态加载器,但实现难度较大) + +## 部署编译 + +从官方文档给出的教程来看,elf2flt 的编译部署主要是如下过程: + +### 准备 + +先更新 `filenames.h`、`elf/riscv.h` 和 `elf/reloc-macros.h`: + +```bash +wget -c https://github.com/gcc-mirror/gcc/raw/master/include/filenames.h +mkdir elf/ && cd elf/ +wget -c https://gitlab.com/git-mirrors/binutils/-/raw/master/include/elf/riscv.h +wget -c https://gitlab.com/git-mirrors/binutils/-/raw/master/include/elf/reloc-macros.h +``` + +安装相关依赖: + +```bash +sudo apt install binutils-dev libiberty-dev +``` + +安装交叉编译器: + +```bash +sudo apt install gcc-riscv64-linux-gnu +``` + +### 配置 + +```bash +./configure --target=riscv64-linux-gnu -with-bfd-include-dir=/usr/include/ --with-binutils-include-dir=/usr/include/ --with-libbfd=/lib/x86_64-linux-gnu/libbfd.a --with-libiberty=/lib/x86_64-linux-gnu/libiberty.a --disable-werror +``` + +### 构建 + +```bash +make +``` + +## 总结 + +总的来说,上面的配置选项适用于在 x86 平台上对 riscv64 平台预先编译构建,但如果要在 riscv64 平台上面直接进行构建,相对来说就会困难许多。其构建过程很难直接遵循上述逻辑,接下来一章,会解释独立在 riscv64 平台进行构建的过程,并且对其进行简化和修改。 -- Gitee From 2e47a026c00038eaea4a8f165c13b3c0f0efefbe Mon Sep 17 00:00:00 2001 From: asterich Date: Wed, 20 Sep 2023 22:47:15 +0800 Subject: [PATCH 2/3] elf2flt-elf2flt-build-0.md: commit correct result of tinycorrect Signed-off-by: asterich --- articles/20230919-elf2flt-elf2flt-build-0.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/articles/20230919-elf2flt-elf2flt-build-0.md b/articles/20230919-elf2flt-elf2flt-build-0.md index 5ccfa21..0bb10dc 100644 --- a/articles/20230919-elf2flt-elf2flt-build-0.md +++ b/articles/20230919-elf2flt-elf2flt-build-0.md @@ -1,8 +1,16 @@ +> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.2-rc2 - [spaces toc urls refs pangu]
+> 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的源码,现在我们来阐述其原理,并分析其构建过程。 +我们在上一篇文章里分析了 elf2flt 的源码,现在我们来阐述其原理,并分析其构建过程。 ## 原理解析 @@ -61,3 +69,11 @@ make ## 总结 总的来说,上面的配置选项适用于在 x86 平台上对 riscv64 平台预先编译构建,但如果要在 riscv64 平台上面直接进行构建,相对来说就会困难许多。其构建过程很难直接遵循上述逻辑,接下来一章,会解释独立在 riscv64 平台进行构建的过程,并且对其进行简化和修改。 + +## 参考资料 + +-. [https://gitee.com/tinylab/riscv-linux/blob/master/articles/20230919-elf2flt-flt-analysis-0.md][001] +-. [https://gitee.com/tinylab/elf2flt][002] + +[001]: https://gitee.com/tinylab/riscv-linux/blob/master/articles/20230919-elf2flt-flt-analysis-0.md +[002]: https://gitee.com/tinylab/elf2flt -- Gitee From 98f6b714479ad7360d3aa355cea1d973be16cab8 Mon Sep 17 00:00:00 2001 From: asterich Date: Wed, 20 Sep 2023 23:01:41 +0800 Subject: [PATCH 3/3] fix article: 20230919-elf2flt-elf2flt-build-0: changed "FLAT" to "bFLT"; changed "elf" to "ELF" --- articles/20230919-elf2flt-elf2flt-build-0.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/articles/20230919-elf2flt-elf2flt-build-0.md b/articles/20230919-elf2flt-elf2flt-build-0.md index 0bb10dc..043c648 100644 --- a/articles/20230919-elf2flt-elf2flt-build-0.md +++ b/articles/20230919-elf2flt-elf2flt-build-0.md @@ -17,13 +17,13 @@ 从上一篇的内容,我们发现对于 elf2flt 来说,其执行上是分成这样几个步骤的: 1. 解析 ELF 文件:elf2flt 首先解析输入的 ELF 文件。这包括读取 ELF 头部、节表、程序头部以及节的内容等信息。 -2. 分析节表信息:elf2flt 分析 ELF 文件的节表,识别哪些节包含可执行代码、数据以及其他相关信息。通常,只有包含可执行代码和数据的节才会包含在 FLAT 文件中。 -3. 生成 FLAT 文件头部:elf2flt 创建一个 FLAT 文件头部,该头部包含了 FLAT 文件的元信息,如入口地址、代码段长度、数据段长度等。 -4. 将节内容复制到 FLAT 文件:elf2flt 从 ELF 文件中将识别出的代码和数据节的内容复制到 FLAT 文件中。这通常涉及将节的内容按照 FLAT 文件的格式进行重新组织和排列。 -5. 生成重定位信息:如果 ELF 文件包含重定位信息,elf2flt 会生成相应的 FLAT 文件重定位信息,以确保在加载 FLAT 文件时可以正确解析和处理符号引用。 -6. 生成 FLAT 文件:最后,elf2flt 将生成的 FLAT 文件写入磁盘,可以将其用于嵌入式系统中的启动加载。 +2. 分析节表信息:elf2flt 分析 ELF 文件的节表,识别哪些节包含可执行代码、数据以及其他相关信息。通常,只有包含可执行代码和数据的节才会包含在 bFLT 文件中。 +3. 生成 bFLT 文件头部:elf2flt 创建一个 bFLT 文件头部,该头部包含了 bFLT 文件的元信息,如入口地址、代码段长度、数据段长度等。 +4. 将节内容复制到 bFLT 文件:elf2flt 从 ELF 文件中将识别出的代码和数据节的内容复制到 bFLT 文件中。这通常涉及将节的内容按照 bFLT 文件的格式进行重新组织和排列。 +5. 生成重定位信息:如果 ELF 文件包含重定位信息,elf2flt 会生成相应的 bFLT 文件重定位信息,以确保在加载 bFLT 文件时可以正确解析和处理符号引用。 +6. 生成 bFLT 文件:最后,elf2flt 将生成的 bFLT 文件写入磁盘,可以将其用于嵌入式系统中的启动加载。 -其执行关键,也是之所以能将 elf 格式转化成可以供无 mmu 系统使用的 bFLT 格式的可执行文件的关键,是其将每节的虚拟地址映射到新生成的重定位信息中,使所有在运行时才确定关系的映射信息转为在加载时确定。 +其执行关键,也是之所以能将 ELF 格式转化成可以供无 mmu 系统使用的 bFLT 格式的可执行文件的关键,是其将每节的虚拟地址映射到新生成的重定位信息中,使所有在运行时才确定关系的映射信息转为在加载时确定。 而动态链接库不是 elf2flt 能够处理的,在此就不说明。(PS:动态链接库可以考虑通过定制化的动态加载器,但实现难度较大) -- Gitee