Linux 之十九 编译工具链、.MAP 文件、.LST 文件
.map
文件和 .lst
文件是嵌入式开发中最有用的俩调试辅助文件。现在主要从事 RISC-V 架构,开始与 GCC 打交道,今天就重点学习一下 GCC 的 .map
文件、.lst
文件,并辅助以 ARMCC 和 IAR 作为对比。
编译工具链
.map
文件和 .lst
文件都是由编译工具链中相应的工具产生的。软件程序的编译过程由一系列的步骤完成,每一个步骤都有一个对应的工具。这些工具紧密地工作在一起,前一个工具的输出是后一个工具的输入,像一根链条一样,我们称这一系列工具为编译工具链。编译工具链主要包含 编译器等可执行程序 与 标准库(常用函数通用实现) 两大部分。
能独立提供编译工具链的厂家并不多,嵌入式平台则更少,主要就是 ARM、IAR、GNU、LLVM。其中,ARM、IAR 是收费的专用软件,其支持的架构有限,而 GNU 的 GCC 则是一款支持众多架构的开源编译套件;LLVM 则是后起之秀,同样也支持众多架构,目前用的不如 GCC 广泛!如下是常用编译器:
第一代编程语言的是汇编语言,因此,第一代编译器是编译汇编语言的。后来,高级语言逐步流行,但是编译工具链中仍然保留了高级语言到汇编语言这一步骤。而原来的汇编语言的编译器被称为汇编器,高级语言的编译器则就称为编译器。除了编译器、链接器等,编译工具链中通常还会包含一些用来处理编译文件相关的辅助工具。例如,以 GCC 中的 objdump
、readelf
为代表的的用来处理对象文件的工具。
至于标准库,绝大多数工具链都是提供一些预编译好的二进制文件(.o
文件),当我们编译自己的程序时,工具链自动以静态链接库的形式引入到我们的最终可执行程序中。通常,这些预编译的文件还会被打包成 存档文件(.a
文件) 来提供(编译工具链中有相应工具来解析执行存档文件,例如,GCC 中的 ar
)。
要编译出最终的可执行程序,通常需要编译、链接、转换这三个阶段。其中,编译即编译器将源码翻译成对象文件,链接即链接器将各个对象文件组合成最终可执行程序。现代编译器通常产生一个通用格式(通常是带有调试信息)的最终可执行程序(ELF 文件),然后使用相应的工具从中提取出实际的纯可执行程序。
- ELF 文件参见博文 Linux 之二十 详解 ELF 文件
- 链接脚本文件见独立博文 Linux 之二十一 链接脚本文件 GCC 的.ld、ARMCC 的 .sct、IAR 的 .icf
有个问题需要注意,GCC 中的 gcc
实际是一个包装器,其会根据输入文件调用实际的编译器,链接器。我们通过相应的命令就可以打断这个流程,例如,-c
选项表示不运行链接器!
具体到编译器,其编译过程通常也是分为多个阶段的。在编译原理这门课程中,我们学过三段式编译器架构,其在编译时要依次经过词法分析、句法分析、语义分析、中间代码生成、代码优化、代码生成 六大阶段。
在编译工具链中,构建编译工具链使用的平台、编译出的编译工具链运行的平台、使用编译出的编译工具链编译出的程序运行的平台三者可以完全不同。其中关键的一步是设置 configure 的参数,该命令有三个参数 --build
、--host
、--target
非常重要,下图是 Windows 上的 MinGW 编译器配置信息:
--build
:这个参数指出了构建编译工具链使用的平台。如果我们不显示指定这个参数的值,那么这个参数的值就会由config.guess
自动识别。--host
:这个参数指出了编译出的编译工具链运行的平台。这个参数的值一般就等于--build
的值。--target
:这个参数指出了使用编译出的编译工具链编译出的程序运行的平台。
通常,本地编译工具链一般就是指的 --build
= --host
= --target
的情况,交叉编译工具链一般是--build
= --host
≠ --target
的情况。不过,基本很少出现--build
≠ --host
的情况。
本地编译工具链
在当前平台(例如 x86 架构的 PC)下,直接编译出来程序(或者库文件),其可以直接在当前的平台运行(或使用)。这个过程就叫做本地编译,使用的编译工具叫做本地编译工具链(简称编译工具链)。例如 PC 上的 VC
、GCC
、LLVM
、TCC
等。
交叉编译工具链
在当前平台下(例如 x86 架构的 PC)下,直接编译出来程序(或者库文件),其不可以直接在当前的平台运行(或使用),必须放到目标平台上(例如 ARM)才可以运行(或使用),这个过程就叫做交叉编译,使用的编译工具叫做交叉编译工具链。例如 PC 中的 armcc
、iar
、特定架构的 GCC
、特定架构的 LLVM
等。
交叉编译工具链又可以根据是否支持 Linux 系统分为 裸机程序交叉编译工具链 和 Linux 程序交叉编译工具链 这两大类。我们上面的举例中,armcc
、iar
都属于裸机交叉编译工具链;而特定架构的 GCC
、特定架构的 LLVM
则根据需要可以支持 Linux 系统,也可以不支持 Linux 系统,因此它既有裸机程序交叉编译工具链,也有 Linux 程序交叉编译工具链。
- 裸机程序交叉编译工具链不能编译 Linux 应用程序,但是,可以用于编译一些嵌入式实时操作系统(FreeRTOS、RT-Thread 等)
- Linux 程序交叉编译工具链不止可以编译 linux 应用程序,也可以编译裸机程序
The xPack Project
The xPack Project 是一个开源项目,其提供了一些列开发工具(重点是裸机下的 C/C++ 相关的)在不同平台的下的构建实例,其中就包含各平台的 GCC 交叉编译工具链,它使用一个多版本依赖管理器来管理各个实例。
实际开发中,我们经常会独立使用它提供的某些工具。例如,Eclipse 的嵌入式 C/C++ 插件 Eclipse Embedded CDT 就包含一些 xPack 提供的工具,以此来实现创建、构建、调试和管理 Arm 和 RISC-V 项目。
-
xPack Windows Build Tools:包括在 Windows 上执行构建所需的额外工具(
make
、rm
等) -
xPack GNU Arm Embedded GCC:ARM 维护的官方 GNU ARM 嵌入工具链的一个代替,可以用于 Windows,MacOS和 GNU/Linux 平台。
-
xPack GNU RISC-V Embedded GCC:裸机 RISC-V GCC 发行版,由SiFive 维护。Windows、macOS 和 GNU/Linux 都有可用的二进制文件。
-
xPack OpenOCD:OpenOCD 的一个新发行版,为更好/更方便地与 OpenOCD 调试插件集成而定制。Windows、macOS 和GNU/Linux 都有可用的二进制文件。
-
xPack QEMU Arm:QEMU(开源机器仿真器)的一个分支,旨在为 Eclipse Embedded CDT 中 的Cortex-M 仿真提供支持。Windows、macOS 和 GNU/Linux都有可用的二进制文件。
.map
文件
.map
文件对应的中文名应该是映射文件,用来展示(映射)项目构建的链接阶段的细节。通常包含程序的全局符号、交叉引用和内存映射等等信息。目前,常见的编译器套件(实际是其中的链接器),例如, GCC、ARMCC、IAR 都可以生成 .map
文件。
MAP 文件是一个与链接脚本文件密切相关的文件,其内容取决于链接脚本文件,链接脚本文件的详细介绍见独立博文 Linux 之二十一 链接脚本文件 GCC 的.ld、ARMCC 的 .sct、IAR 的 .icf。
GCC
GCC 编译工具链中的链接器、汇编器、objdump
等工具都位于 GNU Binutils 中,他们的相关文档可以直接在官网下载。相比于 ARMCC 和 IAR,GCC 的 MAP 文件中的内容比较少!
产生方式
在 GCC 中,MAP 文件就是由链接器 ld
通过使用命令 -Map=mapfile
来输出 map 文件。需要注意,如果同时使用了 --print-map
则会只将 MAP 内容输出到编译窗口,而不会生成 MAP 文件。
需要注意的是,如果使用了编译器 gcc
作为入口(通常都是这么做,不会直接调用链接器),则需要使用 -Wl,-Map,FILE
的方式来将参数传递给链接器。编译器参数 -Wl
是专门用来传递参数给链接器的。同样,如果使用了 -Xlinker --print-map
则只会将 MAP 信息输出到编译窗口,而不会再生成 MAP 文件!
在实际开发中,ECLIPSE 的相关配置如下所示。目前没有该明白,为何它要以 g++ 作为链接器的入口!
内容介绍
在理解内容之前,有必要先了解一下工具链提供的存档文件(Archive File)。前面说过,工具链提供了 lib
这一部分, lib
中的各个函数的实现是已经进行了预编译的,并且把预编译的各种 .o
文件打包成为存档文件(.a
文件)。编译单元即一个 .o
文件。
GCC 的 MAP 文件相比于 ARMCC 和 IAR 内容少了很多
存档文件引用关系
MAP 文件的第一部分内容列出了我们项目中所使用的标准库中提供的函数的基本调用情况,基本格式如下:
存档文件 (编译单元)调用存档文件中接口的文件(调用的符号)
如下图所示的示例,表示 crt0.o 中正在调用 exit 这个接口,而 exit 位于 lib_a-exit.o 这个文件中,而 lib_a-exit.o 这个文件存在于 libg.a 这个存档文件中!
丢弃的输入段
MAP 文件的第二部分内容列出了链接器在生成最终可执行文件时丢弃的输入段,每行一个,四列的含义从左到右依次为节区名、地址、节区大小、节区所在的编译单元。注意,如果节区位于存档文件中,则最后一列是存档文件 + (编译单元)。
内存配置
MAP 文件的第三部分内容列出了我们的内存(存储)配置情况,每行一个,四列的含义从左到右依次为存储的名字、起始地址、大小(字节)、属性(r:读、x:执行、w:写)。
链接脚本和内存映射
关于链接脚本我们后面在详细介绍,这部分链接脚本就是一些 MRI 兼容的链接脚本命令,简单来说,使用 MRI 兼容的链接脚本命令引入一些对象文件(.o
)。 MRI 兼容的链接脚本命令是用于早期链接器的,在 ld
手册中有说明,现在存在的唯一的目的就是兼容!
这部分最有用的是紧随其后的内存映射,这部分列出了所有符号在内存(存储)中的物理地址,这部分就是在辅助调试时最常用的!
ARM
产生方式
参见博文 ARM 之十 ARMCC(Keil) map 文件(映射文件)详解。
内容介绍
参见博文 ARM 之十 ARMCC(Keil) map 文件(映射文件)详解。
IAR
产生方式
由链接器参数 --map
来产生。当启用 MAP 文件后,链接器支持的其他一些参数的输出就会输出到 MAP 文件中。
内容介绍
暂无,后续有需要再补充!
.lst
文件
.lst
文件全称是 Assembler list file,主要用来存储汇编程序列表数据,它通常会拥有比 .map
文件更详细的信息。借助 .lst
文件,同时通过查看栈帧结构(可以通过查看相应的手册来确定栈帧的组成),通过在 .lst
文件中查找 lr
的地址所在的位置,就能立刻定位到问题。
GCC
GCC 编译工具链中的链接器、汇编器、objdump
等工具都位于 GNU Binutils 中,他们的相关文档可以直接在官网下载。
产生方式
.lst
文件通常是由汇编器产生的,对于 GCC 的汇编器 as
,通过使用命令 -a[cdghlmns]=[FILE]
来输出 lst 文件。但需要注意的是,-a[cdghlmns]=[FILE]
参数是独立使用汇编器 as
的时候才生效的。
与上面说的 MAP 文件产生一样,如果使用了编译器 gcc
作为入口(通常都是这么做,不会直接调用汇编器),则需要使用 -Wa,-a,FILE
的方式来将参数传递给汇编器。编译器参数 -Wa
是专门用来传递参数给汇编器的。
在实际开发中,我们经常写 -Wa,-adhlns="$@.lst"
,这样,每编译一个源文件就会产生一个对应的 .lst
文件。需要注意的是,如果是高级语言文件(例如 C 语言),我们需要配置编译器的参数,不要以为仅仅配置汇编器 as
就行(在多数工具中编译器和汇编器是独立配置的)!
注意:在 ECLIPSE 中,它把 objdump
输出文件名也定为了 .lst
。objdump
实际是解析 ELF 文件的工具,与 LIST 文件本没啥关系。 在 ECLIPSE 中,通过如下配置就会默认启用命令 objdump --source --all-headers --demangle --line-numbers --wide "xxx.elf" > "xxx.lst"
来生成最终调试文件对应的 lst 文件,以此来辅助调试。
内容介绍
在实际开发中,汇编器 as
产生的 LST 文件基本很少使用,使用最多的是使用 objdump
工具产生的最终调试程序对应的 LST 文件。这里我们主要就介绍 objdump
产生的 LST 文件。上面说过了, objdump
输出的实际是 ELF 文件内容,详细介绍见独立博文 Linux 之二十 详解 ELF 文件。
–source、–demangle、 --line-numbers、–wide
就是将反汇编与 C 源码混合在一起显示出来。并且尽可能的翻译成人能看懂的代码(翻译符号名、对应行号)!
–all-headers
该命令会输出 Program Header,Sections 以及 SYMBOL TABLE 这个三部分的内容。编译工具产生的最终可执行文件是符合 ELF 规范的二进制文件,这里的输出内容其实都是 ELF 文件的内容,关于 ELF 文件,可以参考 ARM 之一 ELF 文件、镜像(Image)文件、可执行文件、对象文件 详解。
- Program Header:这个就是 ELF 文件的程序头
- Sections: 这个就是从 ELF 文件中的提取的节区信息,共由 8 列组成,每列的含义说明如下:
- 第一列(Idx):从 0 开始的索引号
- 第二列(Name): 节的名字
- 第三列(Size):节的大小(字节)
- 第四列(VMA):Virtual Memory Address 的缩写,表示该节在运行时的地址
- 第五列(LMA):Load Memory Address 的缩写,表示该节的加载地址
- 第六列(File off):该节在文件中的偏移
- 第七列(Algn):对齐字节数,只能是 2 的正整数次幂,由于纯文本没办法显示幂,这里使用
**
表示! - 第八列(Flags):该节的属性标志
- SYMBOL TABLE:这个就是从 ELF 文件中的提取的符号表,由 5 列组成,每列的含义说明如下:
- 第一列:符号的值,通常就是符号的物理地址
- 第二列:这是一组符号标识,共由 7 个标识符组成,某些标识符可以是空格。
- 第一个标识符:取值如下
l
: local Symbolg
: Global Symbolu
: Unique global Symbol!
:其他情况
- 第二个标识符:取值为
w
表示弱符号(Weak),否则为空格表示强符号(Strong) - 第三个标识符:取值为
C
表示构造函数(Constructor ),否则为空格表示普通符号 - 第四个标识符:取值为
W
表示警告符号(Warning),否则为空格表示普通符号。警告符号的名称是一条消息,当警告符号后面的符号被引用时显示出来。 - 第五个标识符:
I
: 该符号是对另一个符号的间接引用i
: 在 reloc 处理期间计算的函数
- 第六个标识符:
d
: 调试符号- D`: 动态符号
- 第七个标识符:
F
: 符号是函数的名称(Function )f
: 一个文件(file)O
: 一个对象(Object)
- 第一个标识符:取值如下
- 第三列:符号对应的节区。如果该节是绝对的(即没有与任何节连接),则是
*ABS*
,如果该节在被转储的文件中被引用,但在那里没有定义,则是*UND*
。 - 第四列:对于普通符号是对齐方式,对于其他符号则是大小
- 第五列:符号名字
ARM
产生方式
使用编译器 armcc
的参数 -asm
以及汇编器 armasm
的参数 --list=file
来输出 lst 文件,两者分别针对 C 语言源文件和汇编源文件生效!
内容介绍
暂无,后续有需要再补充!
IAR
产生方式
使用编译器 iccarm
的参数 -l
以及使用汇编器 iasmarm
的参数 -L
来输出 lst 文件,两者分别针对 C 语言源文件和汇编源文件生效!
内容介绍
暂无,后续有需要再补充!
参考
- https://dzone.com/articles/creating-disassembly-listings-with-gnu-tools-and-e
- https://interrupt.memfault.com/blog/get-the-most-out-of-the-linker-map-file
- https://sourceware.org/binutils/docs-2.40/binutils.html#index-objdump
相关文章:

Linux 之十九 编译工具链、.MAP 文件、.LST 文件
.map 文件和 .lst 文件是嵌入式开发中最有用的俩调试辅助文件。现在主要从事 RISC-V 架构,开始与 GCC 打交道,今天就重点学习一下 GCC 的 .map 文件、.lst 文件,并辅助以 ARMCC 和 IAR 作为对比。 编译工具链 .map 文件和 .lst 文件都是由编…...

小 C 的数学(math)
祝大家劳动节快乐!!小手动起来 言归正传┏ (゜ω゜)☞ 题目描述 小 C 想要成为一名 OIer,于是他提前学习数学,为 OI 做好铺垫。这一天,他的数学老师给了一道题:给定正整数 a,以及给定一个区间 …...

应用运行环境实时洞察,亚马逊云科技Cisco AppDynamics展优势
Cisco AppDynamics(APM)产品,现已正式上线亚马逊云科技Marketplace(中国区域)。可以通过亚马逊云科技Marketplace(中国区域)网站,灵活便捷地部署该解决方案,以便充分利用云原生APM(应用性能管理…...

C++程序设计——lambda表达式
一、问题引入 在C98中,如果想对一个数据集合中的元素进行排序,可以使用sort()方法,但如果待排序元素为自定义类型,就需要用户自己定义排序时的比较规则。 随着C语法的发展,人们开始觉得其编写比较复杂,每次…...

Unity 高级程序员应该具备怎样的能力?要怎样成长为 Unity 高级程序员?
如何从零基础小白成长为 Unity 高级程序员?【全篇学习内容免费!快来白嫖】 高能预警,下文包含从零基础新手到高级程序员一站式技术学习、学习方法、心态等内容,供各个阶段的同学进行参考。 从零基础到高级程序员 上干货 话不多说…...
禁止触摸屏触控板手指缩放,需要这样处理
要禁止触摸屏的手指缩放,可以使用如下的CSS 只要在页面上使用css样式touch-action: none,就能禁止web在手机或平板上的缩放了。 <html style"touch-action: none;">注意: 使用 touch-action: none作用于html元素上࿰…...

opencv cuda版本windows编译
目录 1. 编译准备2. 编译3. 遇到的问题及解决方案3.1 boostdesc_bgm.i,vgg_generated_48.i等文件的缺失3.2 fatal error: features2d/test/test_detectors_regression.impl.hpp: 没有那个文件或目录 1. 编译准备 编译工具是cmakevisual studio2022,首先安装这两个工…...

python哲学
进入python编辑器模式下,输入import this 会打印python之禅(The Zen of Python) Beautiful is better than ugly. 优美胜于丑陋。 Explicit is better than implicit. 明了胜于晦涩。 Simple is better than complex. 简单胜过复杂。 Complex is better than co…...
(2023)用AIGC写iOS项目单元总结
尝试开发的项目 项目功能 用 ChatGPT 开发了一个视频播放器。需要它编写的功能包括: ☆ 本地文件,在线 URL 播放,暂停 ☆ 点击空白区域弹出操作菜单,再点击消失 ☆ 手动横竖屏切换 ☆ 播放速度调整,限定 0.5, 1.0, …...
k8s扩容node节点会影响上面已存在的pod吗?
理论上不影响 扩容 Kubernetes 集群中的节点不会影响已经运行的 Pod,因为 Pod 是在节点上运行的,而不是在集群中运行的。当您添加新的节点时,Kubernetes 调度器会在新节点上启动新的 Pod,而已经运行的 Pod 会继续在它们当前的节点…...

深度学习 -- pytorch 计算图与动态图机制 autograd与逻辑回归模型
前言 pytorch中的动态图机制是pytorch这门框架的优势所在,阅读本篇博客可以使我们对动态图机制以及静态图机制有更直观的理解,同时在博客的后半部分有关于逻辑回归的知识点,并且使用pytorch中张量以及张量的自动求导进行构建逻辑回归模型。 …...

计算机网络学习03(OSI、TCP/IP网络分层模型详解))
1、OSI 七层模型 OSI 七层模型 是国际标准化组织提出一个网络分层模型,其大体结构以及每一层提供的功能如下图所示: 每一层都专注做一件事情,并且每一层都需要使用下一层提供的功能比如传输层需要使用网络层提供的路由和寻址功能࿰…...

ChatGPT是什么?ChatGPT里的G、P、T分别指什么
文章目录 ChatGPT是什么GTP中的 生成式 是什么意思GTP中的 预训练 是什么意思GTP中的 变换模型 是什么意思 什么是Transformer什么是注意力机制 监督学Xi、无监督学Xi、强化学Xi ChatGPT是什么 GPT: Generative Pre-trained Transformer 生成式预训练变换模型 ChatGPT是由Ope…...

Linux服务使用宝塔面板搭建网站,并发布公网访问 - 内网穿透
文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 转载自远程内网穿透的文章:Linux使用宝塔面板搭建网站,并内网穿透实现公网访问 前言 宝塔面板作为简单好用的服务器运维管理面板&#…...
TDA4VH j784s4 使用
// sdk https://www.ti.com/tool/PROCESSOR-SDK-J784S4 // Jacinto Processors TDA4AP-Q1/TDA4VP-Q1/TDA4AH-Q1/TDA4VH-Q1 EVM User’s Guide https://www.ti.com/lit/ug/spruj62/spruj62.pdf?ts1682337275236&ref_urlhttps%253A%252F%252Fwww.ti.com%252Fsitesearch%252…...
CSS布局基础(字体,文本,背景)
字体 常见字体设置 body {font-family: font-family: "Microsoft YaHei", Tahoma, Arial, Hiragino Sans GB,sans-serif; }浏览器从前到后匹配,找到可用字体结束,都没匹配上,使用浏览器默认字体 常用字号 不同浏览器默认字号可…...
Redis入门指南:深入了解这款高性能缓存数据库
本文将带您了解Redis的基本概念、数据类型、特性以及如何在实际项目中应用Redis。通过阅读本文,您将更好地理解如何利用Redis优化您的应用程序性能。 1. 什么是Redis?2. Redis的数据类型3. Redis的特性4. 如何使用Redis4.1 安装与启动4.2 基本命令4.3 应…...
# 数据结构和算法面试题系列-随机算法总结
0 概述 随机算法涉及大量概率论知识,有时候难得去仔细看推导过程,当然能够完全了解推导的过程自然是有好处的,如果不了解推导过程,至少记住结论也是必要的。本文总结最常见的一些随机算法的题目,是几年前找工作的时候…...

windows中vscode配置C/C++环境
首先要把MinGW的环境安装完,我一般是下载带有MinGW的codeblocks,这样省去自己安装MinGW。因为安装MinGW还挺麻烦的。 安装完codeblocks,找到其安装目录,把bin文件配置到环境变量去: 将bin添加到环境变量 然后打开vsco…...

shell编程之条件语句
shell编程之条件语句 一、条件测试操作1.test命令2.文件测试3.利用条件判断,创建文件4.整数值比较4.1 常用的测试操作符 5.字符串比较5.1 常用的测试操作符 6.逻辑测试6.1 常用的测试操作符 二、if语句的结构1.单分支结构2.双分支结构3.多分支结构4.if嵌套 三、case…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...