首页 > 其他分享 >STM32下载ELF文件、最小可执行bin文件测试

STM32下载ELF文件、最小可执行bin文件测试

时间:2023-04-21 20:44:24浏览次数:41  
标签:bin 文件 00 10 elf ELF STM32

1、STM32能下载ELF格式的文件吗?

答:可以。因为所谓的bin文件就是ELF文件的.text代码段。

当然前提是下载工具能识别ELF文件格式,STM32下载ELF文件并不意味着STM32可以把ELF download到Flash上,而是下载工具能从ELF提取到bin文件,下载时通信链路上传输的也只有要bin文件。

例如有elf文件:

$ arm-none-eabi-objdump.exe -s main2.elf

main2.elf:     file format elf32-littlearm

Contents of section .text:
 8000000 00100020 09000008 01488546 fee70000  ... .....H.F....
 8000010 00100020                             ...
Contents of section .ARM.attributes:
 0000 41200000 00616561 62690001 16000000  A ...aeabi......
 0010 05436f72 7465782d 4d340006 0d074d09  .Cortex-M4....M.
 0020 02

 arm-none-eabi-objcopy -O binary main2.elf main2.bin, 它生成bin文件为:

address        00 01 02 03 04 05 06 07   08 09 10 11 12 13 14 15            AscII
00000000    00 10 00 20 09 00 00 08      01 48 85 46 fe e7 00 00        ... .....H.F....
00000010    00 10 00 20            ...

使用STM32 cube programmer直接打开elf文件不仅可以预览,还能直接下载ELF文件,看到的数据和上面使用objump生成的bin文件一样的。

 在cube programmer里连下载地址都不用设置,若打开的是bin文件,无论Flash还是cube programmer,都是需要手动设置Flash下载地址的。

 

2、STM32最小的可执行bin文件是多大?

答:10字节。

  1. 按照STM32编程手册,STM32启动是从0地址取堆栈指针(MSP),从0x04地址取复位入口的PC指针,还需要设置堆栈地址(2条指令),最后是mian函数loop,所以最小的代码至少是4+4+8+2合计20字节。
  2. 倘若不考虑代码通用性,可以把堆栈地址去掉,合计10字节即可,实际代码只有1条2字节。

0x00地址:MSP值。

0X04地址:reset handler地址,值为0x08

0x08地址:BL . (死循环,thumb指令2字节)

  1. 举例如下:

下面的汇编代码中0x04地址为PC初始值: 09 00 00 08,即0x08000009,为何是奇数?

答:cortex MCU不可能产生奇数指令,ARM模式4字节对齐低2位是0,Thumb模式2字节对齐低1位是0,所以PC最低位就属于空闲的,而Cortex MCU需要识别当前是ARM模式还是Thumb模式,所以使用PC最低位就能识别这两种模式。

R15是程序计数器,在汇编代码中用PC表示,ARM规定PC最低位LSB用于表示是ARM指令(0)还是Thumb指令(1)。

$ arm-none-eabi-objdump.exe -d main2.elf

main2.elf:     file format elf32-littlearm


Disassembly of section .text:

08000000 <vtable>:
 8000000:       00 10 00 20 09 00 00 08                             ... ....

08000008 <reset_handler>:
 8000008:       e7fe            b.n     8000008 <reset_handler>

这并不是一个理论demo,而是一个可以执行的程序。

第一步下载:

 第二步,执行,由于这个程序没有任何有效的命令,所以无论如何单步都看不到变化,只能看到SP和PC指针已经正确的load了。

 

简单修改,加一个寄存器做累加计算方便看到效果,每点一次单步寄存器值加1,代码由10字节变为了14字节。

$ arm-none-eabi-objdump.exe -d main2.elf

main2.elf:     file format elf32-littlearm


Disassembly of section .text:

08000000 <vtable>:
 8000000:       00 10 00 20 09 00 00 08                             ... ....

08000008 <reset_handler>:
 8000008:       2000            movs    r0, #0

0800000a <main_loop>:
 800000a:       3001            adds    r0, #1
 800000c:       e7fd            b.n     800000a <main_loop>

 

第一步:下载

第二步:复位,执行指令

8000000: 00 10 00 20 09 00 00 08

8000008: 2000 movs r0, #0

 

单步:执行指令 ,累加和循环

0800000a <main_loop>:

800000a: 3001 adds r0, #1

800000c: e7fd b.n 800000a <main_loop>

 

单步:

 

单步:

 

单步

 

单步:

 

直接全速run后暂停:

 

标签:bin,文件,00,10,elf,ELF,STM32
From: https://www.cnblogs.com/pingwen/p/17341740.html

相关文章

  • ruoyi框架自定义导出的Excel文件名
      https://www.cnblogs.com/an-drew/p/ruoyi-custom-excel.html#!comments这是ruoyi界面的导出按钮,点击导出后 默认导出的Excel文件名是: Unix时间戳+Controller传入的sheetName+.xlsx(对应下图中的文件名:1602402277993+info+.xlsx)  但是我想要的自定义E......
  • vscode误删文件后如何恢复
    数据结构实验课检查实验时,不知道怎么回事,运行vscode时可能碰到了哪个按钮,跳出来一个问题,英语不好没有仔细看就输入了yes,然后成功地把实验文件夹里面所有文件都删了,检查完实验再删也就算了,实验没有检查就删了,下次检查会扣分,加上我把后面一个实验也做好了,我冷汗都吓出来了,是真的体会......
  • c++万能头文件
    #include<bits/stdc++.h>//C++includesusedforprecompiling-*-C++-*-//Copyright(C)2003-2014FreeSoftwareFoundation,Inc.////ThisfileispartoftheGNUISOC++Library.Thislibraryisfree//software;youcanredistributeitand/......
  • Django框架——静态文件配置、form表单、request对象、连接数据库、ORM简介、ORM基本
    配置文件介绍SECRET_KEY='0yge9t5m9&%=of**qk2m9z^7-gp2db)g!*5dzb136ys0#)*%*a'#盐DEBUG=True#调试模式,等项目上线的时候,改成False#配置数据库DATABASES={'default':{'ENGINE':'django.db.backends.sqlite3',#默认是自......
  • QT中在使用QMediaPlaylist类的insertMedia函数插入新播放文件后,出现播放顺序错误的分
    我下面的这段代码的意图是:当前的播放队列中插入一个播放文件到队首,使其为下一个播放文件。但是并没有达到我的预期。于是在代码中加入一段调试程序,将当前的播放文件的序号打印出来。 调试之后的结果如下:发现无论向播放队列中插入几次,当前的播放序列都是1。如果想要在播放......
  • WebStorm 2023.1 vue文件标签中变量无法识别 Unresolved variable or type
    从老版本WebStorm升级到 WebStorm2023.1之后,打开项目莫名爆红 可能是查询的不对,很多博客指明是依赖的问题,实际修改无效问题出在文件类型指向不对修改为: 问题解决 ......
  • /etc/profile, rc.local等文件的执行顺序
    1、各初始化文件执行流程以下是/etc/rc.local与/etc/profile.bash_profile.bashrc等文件的执行顺序。1)通过/boot/vm进行启动vmlinuz2)init/etc/inittab3)启动相应的脚本,并且打开终端rc.sysinitrc.d(里面的脚本)rc.local4)启动login登录界面login5)在用户登录的时候执行sh......
  • Linux系统文件加密的详细教程
    Linux系统一切皆为文件而且Linux系统又是一个多用户系统,所以数据的安全性非常重要,有些情况需要对文件进行加密,那么Linux系统中如何对文件进行加密呢?下面良许教程网为大家分享一下Linux系统文件加密的方法。方法一:gzexe加密 这种加密方式不是非常保险的方法,但是能够满足一般的加......
  • 用C#写一个上传下载文件至OSS后返回文件路径用DES加密解密
    废话不多说,直接上代码:usingAliyun.OSS;//引入阿里云OSSSDKusingSystem;usingSystem.IO;usingSystem.Security.Cryptography;//引入.NETFramework中的加密库usingSystem.Text;publicclassOSSHelper{///<summary>///将文件上传至OSS,并使用D......
  • 怎么打开etl文件
    ctrl+R输入perfmon后回车C:\Users\zhang>cd/dC:\Windows\System32\LogFiles\WMIC:\Windows\System32\LogFiles\WMI>tracerpt.exeNtfsLog.etl-lr-o123.xml-ofXML......