请选择 进入手机版 | 继续访问电脑版

硬汉嵌入式论坛

 找回密码
 立即注册
楼主: WZH
收起左侧

[STM32H7] 论坛首发,STM32实现动态加载模组(似于Windows的dll),使用MDK编译动态库类

  [复制链接]

12

主题

152

回帖

203

积分

高级会员

积分
203
 楼主| 发表于 2022-2-23 15:06:55 | 显示全部楼层
xad74 发表于 2022-2-22 08:03
好东西,这样是不是就意为着当程序出现问题时不用整体更新了,只需更新问题程序就行

回复

使用道具 举报

3

主题

1216

回帖

1225

积分

至尊会员

积分
1225
发表于 2022-4-9 18:45:21 | 显示全部楼层
楼主还在更新吗? 谢谢!
回复

使用道具 举报

12

主题

152

回帖

203

积分

高级会员

积分
203
 楼主| 发表于 2022-4-9 21:10:59 | 显示全部楼层
morning_enr6U 发表于 2022-4-9 18:45
楼主还在更新吗? 谢谢!

兄弟还惦记呢,明天我试着在更新下
回复

使用道具 举报

3

主题

41

回帖

50

积分

初级会员

积分
50
发表于 2022-4-10 10:58:31 | 显示全部楼层
WZH 发表于 2022-4-9 21:10
兄弟还惦记呢,明天我试着在更新下

回复

使用道具 举报

3

主题

1216

回帖

1225

积分

至尊会员

积分
1225
发表于 2022-4-10 19:31:36 | 显示全部楼层
期待更新,好东西自然有粉丝
回复

使用道具 举报

12

主题

152

回帖

203

积分

高级会员

积分
203
 楼主| 发表于 2022-4-15 20:17:22 | 显示全部楼层
morning_enr6U 发表于 2022-4-10 19:31
期待更新,好东西自然有粉丝

已经更新啦
回复

使用道具 举报

3

主题

1216

回帖

1225

积分

至尊会员

积分
1225
发表于 2022-4-15 22:27:10 | 显示全部楼层
已经找到你开的新帖了, 写得非常好,学习中!!!
回复

使用道具 举报

12

主题

152

回帖

203

积分

高级会员

积分
203
 楼主| 发表于 2022-4-16 00:32:29 来自手机 | 显示全部楼层
morning_enr6U 发表于 2022-4-15 22:27
已经找到你开的新帖了, 写得非常好,学习中!!!

加油!欢迎交流
回复

使用道具 举报

0

主题

68

回帖

68

积分

初级会员

积分
68
发表于 2022-4-19 08:59:15 | 显示全部楼层
看了这个帖子,我对跳转与动态加载的区别有了更深刻的理解,  学无止境
回复

使用道具 举报

2

主题

49

回帖

55

积分

初级会员

积分
55
发表于 2022-4-19 12:27:43 | 显示全部楼层
楼主大牛啊!
回复

使用道具 举报

2

主题

49

回帖

55

积分

初级会员

积分
55
发表于 2022-4-19 12:28:44 | 显示全部楼层
学习了!!!
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2022-4-20 15:58:27 | 显示全部楼层
楼主你应该有发现用你这种方法(按你的工程进行编译)是有bug的.比如重定位时多个字符串的地址是同一个地址
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2022-4-20 16:01:24 | 显示全部楼层
楼主你应该有发现用你这种方法(按你的工程进行编译)是有bug的.比如重定位时多个字符串的地址是同一个地址
回复

使用道具 举报

12

主题

152

回帖

203

积分

高级会员

积分
203
 楼主| 发表于 2022-4-20 17:33:05 | 显示全部楼层
renzhen 发表于 2022-4-20 15:58
楼主你应该有发现用你这种方法(按你的工程进行编译)是有bug的.比如重定位时多个字符串的地址是同一个地址

可以详细说说嘛,最好有图片
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2022-4-20 18:30:32 | 显示全部楼层
源码和反汇编以及readelf
源码.jpg
汇编代码.jpg
回复

使用道具 举报

12

主题

152

回帖

203

积分

高级会员

积分
203
 楼主| 发表于 2022-4-20 19:19:00 | 显示全部楼层
renzhen 发表于 2022-4-20 18:30
源码和反汇编以及readelf

这没问题,第一个Relocation为代码中引用全局变量的地址,这个肯定是不同的。
第二个是符号值,这个符号值其实是代表的这个全局变量在整个elf文件中的偏移地址,代码中多次引用同一个全局变量就会出现这种情况。
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2022-4-20 20:33:43 | 显示全部楼层
WZH 发表于 2022-4-20 19:19
这没问题,第一个Relocation为代码中引用全局变量的地址,这个肯定是不同的。
第二个是符号值,这个符号 ...

str = "test string\r\n"; 这句代码通过重定位后,str获取的地址是"hello world\r\n"的地址, 你认真看下,里面有三对movw movt需要重定位, offset 0006 000e 这一对是获取str的地址,其他两对是本来分别是要获取"hello world\r\n" 和 "test string\r\n" 的地址, 但是后面两对都是获取"hello world\r\n"字符串的地址.
回复

使用道具 举报

12

主题

152

回帖

203

积分

高级会员

积分
203
 楼主| 发表于 2022-4-21 09:37:11 | 显示全部楼层
renzhen 发表于 2022-4-20 20:33
str = "test string\r\n"; 这句代码通过重定位后,str获取的地址是"hello world\r\n"的地址, 你认真看下, ...

这汇编确实有点问题,你用的编译器版本是什么呀,我一样的代码,和你的反汇编完全不一样。
file:///C:/Users/wzh/Desktop/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-04-21%20093251.png
file:///C:/Users/wzh/Desktop/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-04-21%20093439.png
file:///C:/Users/wzh/Desktop/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-04-21%20093453.png
回复

使用道具 举报

12

主题

152

回帖

203

积分

高级会员

积分
203
 楼主| 发表于 2022-4-21 09:39:05 | 显示全部楼层
renzhen 发表于 2022-4-20 20:33
str = "test string\r\n"; 这句代码通过重定位后,str获取的地址是"hello world\r\n"的地址, 你认真看下, ...

建议检查一下,重新编译生成一下试试
回复

使用道具 举报

12

主题

152

回帖

203

积分

高级会员

积分
203
 楼主| 发表于 2022-4-21 09:40:57 | 显示全部楼层
屏幕截图 2022-04-21 093251.png 屏幕截图 2022-04-21 093439.png 屏幕截图 2022-04-21 093453.png
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2022-4-21 13:17:12 | 显示全部楼层
这是我的版本截图,你的也发下我看看是不是版本不一样
mdk版本.jpg
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2022-4-21 13:25:03 | 显示全部楼层

你把你现在截图生成的.axf文件使用readelf 查下重定位的代码,截图下我看看
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2022-4-21 13:30:21 | 显示全部楼层

你工程配置是不是改掉了?
回复

使用道具 举报

12

主题

152

回帖

203

积分

高级会员

积分
203
 楼主| 发表于 2022-4-21 13:51:52 | 显示全部楼层
image.png
我用的不是readelf工具查看的,使用的是fromelf查看,我直接把程序镜像还有源码给你吧,你自己找找看看哪里不同。

DLL_PROG.zip

67.87 KB, 下载次数: 16

回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2022-4-21 14:20:49 | 显示全部楼层
WZH 发表于 2022-4-21 13:51
我用的不是readelf工具查看的,使用的是fromelf查看,我直接把程序镜像还有源码给你吧,你自己找找看看哪 ...

用你DLL_PROG.zip编译的和你的结果一样,也就是说跟你原来的工程(APP_Elf_Generate.zip)是不一样的.
希望楼主能研究出一个确实可用的工程(考虑到大代码量时遇到的种种问题).
回复

使用道具 举报

0

主题

9

回帖

9

积分

新手上路

积分
9
发表于 2022-4-23 09:20:40 | 显示全部楼层
contiki里面也实现了动态加载

https://github.com/contiki-os/co ... /loader/elfloader.c
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105914
QQ
发表于 2022-4-23 09:29:55 | 显示全部楼层
回复

使用道具 举报

36

主题

249

回帖

357

积分

高级会员

积分
357
发表于 2022-5-4 16:47:52 | 显示全部楼层
sxw101320 发表于 2021-12-5 18:06
牛,之前做国网产品的时候,国网提供的操作系统就是动态加载app,知道是rtt的lwp模块,但是一直没有弄清楚 ...

在做国网产品?
回复

使用道具 举报

0

主题

20

回帖

20

积分

新手上路

中国梦我的梦

积分
20
发表于 2022-5-5 21:22:26 | 显示全部楼层

之前做,离开一年了
回复

使用道具 举报

36

主题

192

回帖

310

积分

高级会员

积分
310
发表于 2022-5-18 13:47:20 | 显示全部楼层
gitee仓库要公开申请。
之前我的仓库现在都无法访问了,估计楼主你的仓库也这样了。

这波操作难道是为了配合净网???
感觉被恶心到了。
但是github连接实在太慢了,只能用gitee..
回复

使用道具 举报

12

主题

152

回帖

203

积分

高级会员

积分
203
 楼主| 发表于 2022-5-18 23:23:11 | 显示全部楼层
会飞的猪_2020 发表于 2022-5-18 13:47
gitee仓库要公开申请。
之前我的仓库现在都无法访问了,估计楼主你的仓库也这样了。

确实挺恶心的,刚刚才知道gitee有这个问题,已经申请了
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2022-5-21 19:53:05 | 显示全部楼层
WZH 发表于 2021-12-5 19:13
大家可以在评论下动态加载的实战意义大不大,如果大的话,我后面写一篇详细一点的关于实现原理的技术文档。 ...

动态加载,有时挺有用的,我总结了几个场景:
应用场景分析
1. 我们目前在MCU上跑dlmodule,可能更多是抱着学习,了解原理的心态,一般来说,
动态模块会使用在RAM大于4MB的平台中。
2. 动态模块可以对未来不可预知的一些功能的扩展
3. 可以做到类似于安卓app,把一些特殊功能的应用交给第三方的模块独立完成
4. 调试使用,比如调试某个具体功能时,如果每次都修改整个项目工程的源码,然后
    编译,下载,如果整体烧写flash效率比较低,此时就可以使用动态模块调试
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2022-5-25 14:07:07 | 显示全部楼层
WZH 发表于 2021-12-14 20:38
对,我的实现方法和这篇文章大体思路是一样的,但在具体操作上略有不同。我没做符号表的支持,也就 ...

不知道是否可以通过APP工程生成的.o文件连接base工程生成的elf内函数和变量的地址,完成APP.bin文件生成
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2022-5-27 14:54:41 | 显示全部楼层
对于这些如何移植过来,还有一些疑问,实际自己需要动态加载的.axf和动态解析的功能模块是怎么工程配置的呢?
回复

使用道具 举报

12

主题

152

回帖

203

积分

高级会员

积分
203
 楼主| 发表于 2022-5-27 15:54:35 | 显示全部楼层
471813942 发表于 2022-5-27 14:54
对于这些如何移植过来,还有一些疑问,实际自己需要动态加载的.axf和动态解析的功能模块是怎么工程配置的呢 ...

基于STM32动态加载实现原理V1.0
https://www.armbbs.cn/forum.php? ... 9&fromuid=24016
(出处: 硬汉嵌入式论坛)
可参考此帖子的内容
回复

使用道具 举报

12

主题

152

回帖

203

积分

高级会员

积分
203
 楼主| 发表于 2022-5-27 15:56:56 | 显示全部楼层
leeeeeeeeee 发表于 2022-5-25 14:07
不知道是否可以通过APP工程生成的.o文件连接base工程生成的elf内函数和变量的地址,完成APP.bin文件生成

这个不太好实现,因为在每次编译工程时,函数地址一般都会变化。
回复

使用道具 举报

7

主题

18

回帖

39

积分

新手上路

积分
39
发表于 2022-10-15 13:28:53 | 显示全部楼层
用楼主的工程没有生成SHT_REL的,MDK5.37,是哪里不对吗?
回复

使用道具 举报

7

主题

18

回帖

39

积分

新手上路

积分
39
发表于 2022-10-15 13:29:31 | 显示全部楼层
** ELF Header Information

    File Name: dll_generate.axf

    Machine class: ELFCLASS32 (32-bit)
    Data encoding: ELFDATA2LSB (Little endian)
    Header version: EV_CURRENT (Current version)
    Operating System ABI: ARM BPABI with Symbol Versioning
    ABI Version: 0
    File Type: ET_EXEC (Executable) (2)
    Machine: EM_ARM (ARM)

    Image Entry point: 0x00000005
    Flags: EF_ARM_HASENTRY + EF_ARM_ABI_FLOAT_HARD (0x05000402)

    ARM ELF revision: 5 (ABI version 2)

    Conforms to Hard float procedure-call standard

    Header size: 52 bytes (0x34)
    Program header entry size: 32 bytes (0x20)
    Section header entry size: 40 bytes (0x28)

    Program header entries: 3
    Section header entries: 10

    Program header offset: 52 (0x00000034)
    Section header offset: 756 (0x000002f4)

    Section header string table index: 9

========================================================================

** Program header #0 (PT_LOAD) [PF_X + PF_R + PF_ARM_ENTRY]
    Size : 180 bytes
    Virtual address: 0x00000000 (Alignment 4)


====================================

** Program header #1 (PT_LOAD) [PF_R]
    Size : 0 bytes
    Virtual address: 0x000000b4 (Alignment 4)


====================================

** Program header #2 (PT_DYNAMIC) [PF_R]
    Size : 96 bytes
    Virtual address: 0x00000000 (Alignment 4)


========================================================================

** Section #1 'ER_IROM1' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR]
    Size   : 180 bytes (alignment 4)
    Address: 0x00000000


** Section #2 '.dynstr' (SHT_STRTAB)
    Size   : 52 bytes


** Section #3 '.dynsym' (SHT_DYNSYM)
    Size   : 64 bytes (alignment 4)
    String table #2 '.dynstr'
    Last local symbol no. 0


** Section #4 '.hash' (SHT_HASH)
    Size   : 36 bytes (alignment 4)
    Symbol table #3 '.dynsym'


** Section #5 '.version' (SHT_GNU_versym)
    Size   : 8 bytes (alignment 4)
    Symbol table #3 '.dynsym'


** Section #6 '.version_d' (SHT_GNU_verdef)
    Size   : 56 bytes (alignment 4)
    String table #2 '.dynstr'


** Section #7 '.dynamic' (SHT_DYNAMIC)
    Size   : 96 bytes (alignment 4)
    String table #2 '.dynstr'


** Section #8 '.note' (SHT_NOTE)
    Size   : 20 bytes (alignment 4)


** Section #9 '.shstrtab' (SHT_STRTAB)
    Size   : 96 bytes
回复

使用道具 举报

12

主题

152

回帖

203

积分

高级会员

积分
203
 楼主| 发表于 2022-10-15 19:55:38 | 显示全部楼层
pokemonds 发表于 2022-10-15 13:29
** ELF Header Information

    File Name: dll_generate.axf

用我gitee仓库里的程序版本试试,原本的版本貌似有问题
https://gitee.com/wzh1845462801/dynamic_loader
回复

使用道具 举报

12

主题

152

回帖

203

积分

高级会员

积分
203
 楼主| 发表于 2022-10-15 20:04:06 | 显示全部楼层
pokemonds 发表于 2022-10-15 13:29
** ELF Header Information

    File Name: dll_generate.axf

程序中如果没有静态变量的话也会出现这种情况,因为这时程序中不需要引用任何变量的地址,自然也就没有用重定位的节区了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-3-28 18:06 , Processed in 0.376040 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表