[toc]
art-pi构建命令
1 | export CROSS_COMPILE=arm-none-eabi- ARCH=arm |
F4 构建命令
1 | export CROSS_COMPILE=arm-none-eabi- ARCH=arm |
Makefile
- 查看Makefile.md
- 学习的Makefile如下:Makefile
功能
V=1 显示完成命令输出
V=1
:告诉make
显示完成的命令输出。这对于调试构建过程非常有用,因为它可以显示构建过程中执行的所有命令。- 没有设置
V
时,make
默认不显示命令输出。 - 其中
Q = @
,@
用于抑制命令的输出
1 | # make V=1 显示完成命令输出 |
-s 静默模式
-s
:告诉make
进入静默模式。在静默模式下,make
不会显示构建过程中执行的命令。- 设置
quiet
变量为silent_
,这样就可以在构建过程中使用$(quiet)
前缀来隐藏命令的输出。
1 | ifneq ($(filter 4.%,$(MAKE_VERSION)),) # make-4 |
O= 输出目录
1 | make CROSS_COMPILE=arm-none-eabi- ARCH=arm -j3 O=output/ |
- 使用
KBUILD_SRC
设置输出目录。使用O
变量设置输出目录,如果O
变量没有设置,则使用KBUILD_SRC
变量设置输出目录。
1 | ifeq ($(KBUILD_SRC),) |
C=1 启用静态检查
- 使用 ‘make C=1’ 来启用仅检查重新编译的文件。
- 使用 ‘make C=2’ 来启用对 所有 源文件的检查,无论它们是否被重新编译。
M = 构建的外部模块的目录
- 使用 make M=dir 指定要构建的外部模块的目录
- 旧语法 make …SUBDIRS=$PWD 仍受支持
- 设置环境变量KBUILD_EXTMOD优先
cc-option CC编译器选项测试检查
1 | # output 目录进行以下测试 |
scripts 用于构建脚本的工具
Kconfig 相关的功能
Kconfig
是一个配置文件,用于定义内核的配置选项。它使用一种类似于 C 语言的语法,包含一系列配置选项和依赖关系。Kconfig
文件通常由Kconfig
工具解析,生成配置文件(.config
)。
1 | config - 使用行定向程序更新当前配置 |
- 强制使用需修改Kconfig文件
1 | mainmenu "U-Boot $(UBOOTVERSION) Configuration" |
config 使用行定向程序更新当前配置
通过命令
./scripts/kconfig/conf --oldaskconfig Kconfig
运行运行的是命令行版本的配置工具,用于解析Kconfig文件并生成配置文件。
1 | * |
- 用法
1 | --listnewconfig 列出新的选项 |
- 代码解析
1 | int main(int ac, char **av) |
menuconfig 使用基于菜单的程序更新当前配置
- 通过命令
./scripts/kconfig/mconf Kconfig
运行 - 运行的是menuconfig的配置工具,使用基于菜单的程序更新当前配置
1 | embedsky@ubuntu:~/share/u-boot$ ./scripts/kconfig/mconf Kconfig |
- 展开为
1 | arm-none-eabi-gcc -E -nostdinc -P -I . -undef -x assembler-with-cpp ./arch/../configs/stm32h750-art-pi_defconfig -o generated_defconfig |
构建流程
Ubootb编译第一步通常是执行make xxx_config
在编译指定顶层目录生成.c onfig文件,这种方式要求厂商 提供一个基础的xxx_config文件(通常来说开发者不会通过执行make menuconfig从零开始配置,这个工作过量太大了)。
查看编译流程时,优先查看
xxx:
这类可执行目标;如果make 没有带目标时,则优先查看第一个目标,因为是执行的这个目标;从头开始查看,需要注意查看include
是否引入的xxx:
这里的目标是
xxx_config:
,即%config:
1 | # 定义了一个模式规则,匹配所有以 config 结尾的目标 |
- %config 还会依赖于
scripts_basic
和outputmakefile
,FORCE
是一个空目标,用于强制执行规则。
build变量的定义
- 观察顶层makefile
1 | # 我们需要一些通用定义(不要尝试重新制作文件)。 |
- 在scripts/Kbuild.include 中定义:
1 |
|
编译scripts_basic 生成fixep
outputmakefile 生成Makefile
执行scripts/kconfig Makefile
编译生成conf
执行conf –defconfig=generated_defconfig Kconfig
include/config/auto.conf、 include/config/auto.conf.cmd、 include/generated/autoconf.h
Ubootb编译 执行make 操作
shell 命令
- 查看shell.md
GNU C
- 查看GNU C.md
objdump 工具
反汇编 -d
1 | objdump -d start.o |
- 更多的详细信息,可以使用 -S 选项,它会将源代码和反汇编代码一起显示
- 问题:
objdump: can't disassemble for architecture UNKNOWN!
- 出现这个错误可能是因为 objdump 工具无法识别目标文件的架构。你可以尝试显式指定架构来解决这个问题。
1
objdump -d -m arm start.o
- 使用
file
命令查看文件类型1
2file start.o
arch/arm/cpu/armv7m/start.o: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), with debug_info, not stripped - 使用
objdump -i
查看支持的架构 - 根据你的架构 armv7m,使用
arm-none-eabi-objdump
查看段信息 -h
显示段内容 -s
反汇编指定的段 -j
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 wdfk-prog的个人博客!
评论